From: Makoto Kuwata Date: 2008-02-11T03:02:10+09:00 Subject: [ruby-dev:33689] Re: erb.rb の仕様について 桑田です。 2008/2/10 Masatoshi SEKI : > > 私も桑田さんに質問があります。 > > erbやerubyは、実行時エラーの行番号の情報がわかるように > 元のeRubyスクリプトの行を維持したスクリプトに変換してい > ます。 > > RubyKaigiの講演では連続した文字列は、行をまたいでいても > つなげてしまうように見えたのですが、erubis方面ではそういった > ニーズはないのでしょうか? > ??? 別に行をまたいでいても、エラーメッセージでは Ruby が 行番号を正しく出してくれると思うんですが。 たとえば次のような eRuby ファイルがあったとして: hoge.rhtml -------------------- <% for item in @list %> <% end %>
<%= item.upcase %>
-------------------- Erubis は連続した行を 1 つの文字列にします。 次の例だと 3 行目から 4 行目と、4 行目から 5 行目で 行をまたいだ文字列がでてきます。 -------------------- $ erubis -x hoge.rhtml | cat -n 1 _buf = ''; _buf << ' 2 '; for item in @list 3 _buf << ' 4 5 6 '; end 7 _buf << '
'; _buf << ( item.upcase ).to_s; _buf << '
8 '; 9 _buf.to_s -------------------- でもこのせいで、エラーがあったときに Ruby がおかしな 行番号を表示するようなことはないですよね。 次のは @list に ['aaa', 'bbb', nil] を設定して実行 している例ですが、4 行目に <%= item.upcate %> があるので、 nil.upcase がエラーになっています。 Ruby は、エラーは 4 行目であることをちゃんと報告して くれていることがわかります。 -------------------- $ erubis -c '{list: [aaa, bbb, null]}' hoge.rhtml hoge.rhtml:4: undefined method `upcase' for nil:NilClass (NoMethodError) -------------------- おっしゃっているのは、式展開を使った場合のことでしょうか。 その場合でも、特に問題はないんですが。 -------------------- $ erubis -E Interpolation -x hoge.rhtml | cat -n 1 _buf = ''; _buf << %Q`\n` 2 for item in @list 3 _buf << %Q` 4 5 \n` 6 end 7 _buf << %Q`
#{ item.upcase }
\n` 8 _buf.to_s $ erubis -E Interpolation -c '{list: [aaa, bbb, null]}' hoge.rhtml hoge.rhtml:4: undefined method `upcase' for nil:NilClass (NoMethodError) -------------------- 複数行にわたる文字列や here document の中で式展開を使っても、 Ruby は賢いから正しいエラー行番号をだしてくれます。 なにか質問の意図を間違っていたらすみません。 -- makoto kuwata