0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rubyのメソッド内で引数に再代入してから `super` と呼び出した場合 → 再代入したものが使われる

Posted at
  • 「たしか 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) という感じに補完してくれて、結果として再代入したほうが使われる。

念のためリファレンスマニュアルを見たら、サンプルコードにしっかり書いてあった。(やはり文章での説明だとどちらにも解釈できるので難しい)

  1. 代入でなく破壊的メソッドを作用させただけの場合は、元のも新しいのもオブジェクトとしては同一なので今回の疑問の対象外

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?