最近になってRubyを勉強し始めたのだれど、不可解な現象に遭遇した。
私は何かとメソッドチェインを繰り返す癖があるので、油断するとすぐに1行が長くなってしまう。
で、これはイカンと適当なところで改行を入れるようにしているのだけど、ご存知の通りRubyは改行を式の区切りとして認識する。
それを避けるためには行末にバックスラッシュを入れればいいのだが、明らかに式の途中だとわかる場合は自動で認識してくれるらしい。
と、以前どこかで見たのだけれど、どこで見たのか完全に失念。それに関する資料を探しているのだけれど、全然見当たらない。どなたか知っていたら教えて下さい。
で、探すのは諦めて自分で色々試して見る。環境はRuby 1.9 rc2 mswin32版。
# (1) p 1 + 1 # => 1 # (2) p 1 + 1 # => 2
(1)の方は1をpする式と+1と言う式の2つがあるとみなされて、結果は1。
(2)の方は、行が+で終わっていて、まだ続きがありそうだと言うことで次の行も見て1+1で結果は2。
# (3) puts (1 + 1) # => syntax error, unexpected '+', expecting ')'
括弧が閉じてないので推測してくれるだろうと期待したが、syntax errorが出てしまった。さすがにそううまくは行かないらしい。
# (4) p [1, 1] # => [1, 1] # (5) p [1 ,1] # => syntax error, unexpected ',', expecting ']'
(4)のように行末がカンマだと大丈夫。行頭だとダメ。もしかして行末の文字だけ見てる?
さて問題、次の出力はどうなるか。
p 1 + (2 + 4 + 8)
普通に考えたらエラーか、良くて15といったところだろう。解答。
# => 9
一体何が起こったのか、さっぱりわからない。結果から察するに、恐らく2行目が完全に無視されている。謎すぎる。
もちろん改行をなくしたり行末にバックスラッシュを入れれば15になる。
p 1 + (2 + 4 + 8) # => 15 p 1 + \ (2 + 4 \ + 8) # => 15
まったく法則がわからない。それとももしかしてバグだったりするのだろうか。
どちらにしてもドキュメント見当たらないし、他の人が見てわかりづらいと思うので、暗黙的な改行は使わない方が良さそうかな。