Mae向きなブログ

Mae向きな情報発信を続けていきたいと思います。

1.9.3と1.8.7の挙動の違い

ケース(1)

以下のコードですが、これだと1.9.3、1.8.7でも動きますが、

# -*- coding: utf-8 -*-
class Foo
  def foo
    "foo"
  end
end

class Bar < Foo
  def foo
    super + "bar"
  end
  alias bar foo
  undef foo
end
puts Bar.new.bar

ケース(2)

以下のように、undef fooの位置を上の方に持っていくと、

# -*- coding: utf-8 -*-
class Foo
  def foo
    "foo"
  end
end

class Bar < Foo
  undef foo
  def foo
    super + "bar"
  end
  alias bar foo
end
puts Bar.new.bar

1.9.3の場合は以下のように実行できますが、

$ ruby -v
ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-darwin11.2.0]
$ ruby foo.rb
foobar

1.8.7では、以下のようにエラーが出て実行できません。

$ /usr/bin/ruby -v
ruby 1.8.7 (2010-01-10 patchlevel 249) [universal-darwin11.0]
$ /usr/bin/ruby foo.rb
foo.rb:11:in `bar': superclass method `foo' disabled (NameError)
	from foo.rb:15

どちらのバージョンの挙動がしっくりきますか?