チケット #2402 が更新されました。 (by Shugo Maeda)


特異クラス定義でsuperした時はNoMethodErrorになるようです。

defiant:build$ cat t2.rb  
class Foo
  def foo
    p self
  end
end

class Bar < Foo
  def foo
    x = Object.new
    class << x
      super
    end
  end
end

Bar.new.foo
defiant:build$ ./ruby-trunk.1124 -v t2.rb 
ruby 1.9.2dev (2009-11-24 trunk 25909) [i686-linux]
t2.rb:11:in `singletonclass': super called outside of method (NoMethodError)
	from t2.rb:10:in `foo'
	from t2.rb:16:in `<main>'

1.8ではFoo#fooが呼ばれます。

defiant:build$ ruby-1_8 -v t2.rb         
ruby 1.8.8dev (2009-10-22 revision 25430) [i686-linux]
#<Bar:0xb7ea443c>

参考までに他の処理系では以下のような挙動でした。

defiant:build$ ir -v t2.rb
IronRuby 0.9.1.0 on .NET 2.0.0.0
#<Bar:0x0000056>
defiant:build$ jruby -v t2.rb
jruby 1.5.0.dev (ruby 1.8.7 patchlevel 174) (2009-11-12 421150b) (Java HotSpot(TM) Client VM 1.6.0_16) [i386-java]
#<Class:#<Object:0x180cf2a>>
defiant:build$ rbx -v t2.rb
rubinius 0.13.0-dev (1.8.7 e614007b 2009-11-06) [i686-pc-linux-gnu]
An exception occurred running t2.rb
    No method 'bytecode' on an instance of NilClass. (NoMethodError)

それぞれ個性があって面白いですね。

個人的には例外でもいいんじゃないかなと思いますが、1.9のinstance_evalでの
superや、JRubyの特異クラス定義でのsuperのように、変なレシーバでsuperが
呼ばれてしまうのはまずいんじゃないかと思います。
----------------------------------------
http://redmine.ruby-lang.org/issues/show/2402

----------------------------------------
http://redmine.ruby-lang.org