- 「たしか
super
を引数なしで呼び出したら、現在のメソッドの引数と同じものが渡されるんだっけ」 - 「あれ? 引数に代入して上書きした場合1、元のと新しいののどっちが使われるんだろう?」
と分からなくなったので、実験してみた。
class Foo
def mtd(str)
puts "[Foo:1] str => %p (%#08x)" % [str, str.__id__]
end
end
class Bar < Foo
def mtd(str)
puts "[Bar:1] str => %p (%#08x)" % [str, str.__id__]
str *= 2
puts "[Bar:2] str => %p (%#08x)" % [str, str.__id__]
super
end
end
Bar.new.mtd("abc")
結果
[Bar:1] str => "abc" (0x00003c) <-- 仮引数に渡された元のオブジェクト
[Bar:2] str => "abcabc" (0x000050) <-- 再代入して上書きしたオブジェクト(IDが異なる)
[Foo:1] str => "abcabc" (0x000050) <-- 結果:上書きしたほうが使われる
super
とだけ書いた場合は super(str)
という感じに補完してくれて、結果として再代入したほうが使われる。
念のためリファレンスマニュアルを見たら、サンプルコードにしっかり書いてあった。(やはり文章での説明だとどちらにも解釈できるので難しい)
-
代入でなく破壊的メソッドを作用させただけの場合は、元のも新しいのもオブジェクトとしては同一なので今回の疑問の対象外 ↩