Ruby で引っかかったコード
Ruby で以下のようなコードを書くとどうなるでしょう.
a = [1,2,3] a.each do |a| puts a.to_s end a.each do |a| puts a.to_s end
期待していたのはこんな感じ.
でも実際には
1
2
3
1
2
3
となってしまって思考がフリーズしてしまった.
1
2
3
hoge.rb:7: undefined method `each' for 3:Fixnum (NoMethodError)
きっと Ruby 使いの人には当たり前なんだろうけど,
失敗の根本原因は僕がブロック引数のスコープはブロックの
中だけだと思っていたこと.
ようするに,一つ目の each で a が書き換えられて,2つ目の a.each の a は 3 になってしまっているのが原因でしたとさ.
よく分からずに書くもんじゃないな.
追記:
コメントいただきました.
上記のようになるのは1.8系で,1.9では期待通り動きます.
個人的にはλ計算的な意味でそっちのほうが自然だと思うのですが,Ruby ではそもそも同じ変数名を使うようなプログラムはよくないという判断だったりするのだろうか.