私は2つのクラスFoo
とBar
持っている:あなたは "副作用" が2回起きているのを見ることができるように'self'にメッセージを送信すると、initializeメソッドが呼び出されますか?
Inside Foo init...
Side effect happening...
Inside some_method inside Foo...
Inside Foo init...
Side effect happening...
:
require 'pry-byebug'
require 'fileutils'
class Foo < Pathname
include FileUtils
def initialize(path)
puts "Inside Foo init..."
super
puts "Side effect happening..."
end
def some_method
puts "Inside some_method inside Foo..."
basename.to_s
end
end
class Bar < Foo
end
bar = Bar.new('bar')
# binding.pry
bar.some_method
をこれが出力されます。 pry-byebug
セッションを見てみると、確認:
Inside Foo init...
Side effect happening...
From: /Users/max/Dropbox/work/tmp/super_test/foo.rb @ line 23 :
18: class Bar < Foo
19: end
20:
21: bar = Bar.new('bar')
22: binding.pry
=> 23: bar.some_method
[1] pry(main)> step
From: /Users/max/Dropbox/work/tmp/super_test/foo.rb @ line 13 Foo#some_method:
12: def some_method
=> 13: puts "Inside some_method inside Foo..."
14: basename.to_s
15: end
[1] pry(#<Bar>)> step
Inside some_method inside Foo...
From: /Users/max/Dropbox/work/tmp/super_test/foo.rb @ line 14 Foo#some_method:
12: def some_method
13: puts "Inside some_method inside Foo..."
=> 14: basename.to_s
15: end
[1] pry(#<Bar>)> step
From: /Users/max/Dropbox/work/tmp/super_test/foo.rb @ line 7 Foo#initialize:
6: def initialize(path)
=> 7: puts "Inside Foo init..."
8: super
9: puts "Side effect happening..."
10: end
だから、それを破壊:
- 私は
bar
をインスタンス化Foo
から継承Bar
のインスタンスです。Bar
のスーパークラス 'initialize
が呼び出され、「副作用」が発生します。これまでのところこれは完全に期待されています。私はルビーが起動して、右に行くとRubyはsome_method
の内側にホップとbasename
呼ば
- の内側にそれを見つけたので、それを持っていません
bar
上some_method
呼び出す - Rubyはバック
Foo
's' はinitialize
方法へ行く?...
self
にメッセージを送信しています方法を見つける
Foo
ステップ4は驚きによって完全に私をキャッチされています。 self
にメッセージを送信すると、initializeメソッドが再び呼び出されるのはなぜですか?これはどこに文書化されていますか?これは期待されていますか?
これを制御することは可能ですか?あるいは、私が実際にクラスをインスタンス化していて、そこに無作為に着くだけではないので、私がinitializeメソッドの中にいるかどうかを条件付きでチェックしますか?たとえば、
class Foo < SomeClass
def initialize args
@args = args
if instantiating_a_class?
puts "Side effect happening..."
else
puts "Don't do anything..."
end
end
end
は、それがむしろ 'Pathname'上に固定されているよりも、クラスを尊重しています。 – tadman
私はそれが意図されているか分からない。 'rb_class_new_instance'のクラス引数として' rb_obj_class(self) 'を渡すだけの副作用でもあります。 IOW:「怠惰な実装方法」ほど「尊重」していないかもしれません。 –