[#43494] ブロックとともに呼び出されたsortについて — "Toshiyuki Ogura" <oguradio@...>

小倉です。

12 messages 2007/05/15

[#43508] rubyのテキストについて — 桑江 康公 <ykuwae@...>

はじめまして、桑江といいます。プログラム開発の勉強をはじめたいと考えています。いろいろと調べたのですが、オブジェクト指向を使った開発が現在しりゅうとのことで、Javaを勉強しようと考えていたのですが、rubyという言語もあるということがわかりネットで調べたところこのメーリングリストにたどり着きました。どなたかプログラム開発初心者でもわかりやすい本またはサイトがありましたら教えていただけないでしょうか?ちなみに、私のレベルはHTMLが少しわかる程度です。

8 messages 2007/05/15

[ruby-list:43476] 不可解なブロック引数

From: "TKS." <tks@...>
Date: 2007-05-06 09:34:05 UTC
List: ruby-list #43476
TKS.と申します。

不可解な問題が起きており、私の手に負えないのでとりあえず報告してみます。


現在 ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-linux] で、
ruby-sqlite3 + ERB + fastcgi(pure ruby版、each_cgiでCGI動作) を使用し
CGIを作っています。

ERB::Compiler#compile で
> scanner.scan { |token| ... }
とし、内部的には ERB::Compiler::TrimScanner#trim_line2 で
> (RHTMLの1行).split(正規表現).each{ |token| ...; yield token }
と返ってきているのですが、ERB::Compiler#compile に
ブロック引数として渡される token に Fixnum が混じります。

また、この Fixnum は、Rubyのコードに無意味な改行を入れたりすることで
混ざったり混ざらなかったりします。


入出力を見てみたところ次のようになっていました。

パース対象のRHTML行: "\t\t</div>\n"
> trim_line2 token: [String, "\t\t</div>"]
> compile token:    [String, "\t\t</div>"]
> compile token:    [Fixnum, 136134264] (何故か trim_line2 を経由せず)
> ./rb/erb.rb:556:in `<<': can't convert Fixnum into String (TypeError)

パース対象のRHTML行: 
  "<li>開始:<%= gname %> [<%= gplace %><%= gloc2 %>]</li>\n"
> trim_line2 token: "<li>開始:"
> compile token:    "<li>開始:"
>   (中略)
> trim_line2 token: [String, " ["]
> compile token:    [String, " ["]
> trim_line2 token: [String, "<%="]
> compile token:    [Fixnum, 135817580"] (渡されたときに変化?)
> ./rb/erb.rb:555:in `<<': can't convert Fixnum into String (TypeError)

TypeErrorを無視してFixnumの前後を確認。

パース対象のRHTML行:
  "<li>開始:<%= gname %> [<%= gplace %><%= gloc2 %>]</li>\n"
(前略)
> trim_line2 token: "<%="
> compile token:    [String, "<%="]
> compile token:    [Fixnum, 136362012]
> compile token:    [Fixnum, 135990180]
(15行中略、全て Fixnum)
> compile token:    [Fixnum, 135792180]
> compile token:    [Fixnum, 135740336]
> trim_line2 token: [String, " gloc2 "]
> compile token:    [String, " gloc2 "]
(Fixnumが無駄に送られてくるだけで、これを無視すれば正常)

上記は全て token を監視する部分以外は同じコードでした。
特に1つめと2つめは無意味な改行を挿入しただけでこの様な変化が起きました。
コードに一切の変更がない場合は、Fixnumの値も含めて全て同じ状況になりました。
また、無意味な半角スペースを入れた場合、Fixnumが来る場所は同じですが
値が変わる場合がありました。(規則性は不明でした)

以前にも似た状況になったことがあります。
その時は Cygwin で、Ruby は 1.8.5 ぐらいだったと思いますが、
ActiveRecord + ruby-sqlite3 + ERB + mongrel でした。
とりあえず Fixnum を全て無視して利用した覚えがあります。



ここまで調べたところで時間的に厳しくなってきたので
とりあえずご報告させていただきます。

再現できる短いコードを見つけたらまたご報告します。


In This Thread

Prev Next