Born Too Late

Yuya's old tech blog.

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 の動作が、一般的に見て自然と思われるものではないでしょうか。これ、いつのタイミングで変わったんですかね ?