Ruby 1.9.x ではイテレータにおけるスコープが変わった模様
2010-08-22 01:21:11
ささたつ (@sasata299) さんの「Rubyのスコープややこしや〜 」を読んで、ちょっと驚きだったので、調べてみました。
検証用コード
ささたつさんのコードとはちょっと違いますが、調べようとしていることは特に変わりません。
Ruby 1.8.7
apt-get でインストールした MRI の場合。
$ ruby -v ruby 1.8.7 (2010-01-10 patchlevel 249) [i486-linux] $ ruby check_scope.rb r = 15 n = 10
?!
これはつまり、はじめに定義した変数 n が、イテレータにより上書かれていることを意味します。
JRuby 1.5.1
ソースコードから手動インストールした JRuby。
$ jruby -v jruby 1.5.1 (ruby 1.8.7 patchlevel 249) (2010-06-06 f3a3480) (OpenJDK Client VM 1.6.0_18) [i386-java] $ jruby check_scope.rb r = 15 n = 10
1.8.7 と全く同様の結果に。Ruby 1.8.7 を実装したものなので、当然といえば当然ですね。
Ruby 1.9.2
先日リリースされたばかりの最新版。ソースコードから手動インストールしました。
$ ruby192 -v ruby 1.9.2p0 (2010-08-18 revision 29036) [i686-linux] $ ruby192 check_scope.rb r = 15 n = 100
こちらでは、イテレータ内での変数 n はローカルに閉じており、はじめに代入した n は上書かれていないことがわかります。
1.9.2 の動作が、一般的に見て自然と思われるものではないでしょうか。これ、いつのタイミングで変わったんですかね ?