2番目の「p arg」がFooインスタンスを報告するのはなぜですか?
-
07-07-2019 - |
質問
class Foo
def with_yield
yield(self)
end
def with_instance_eval(&block)
instance_eval(&block)
end
end
f = Foo.new
f.with_yield do |arg|
p self
# => main
p arg
# => #<Foo:0x100124b10>
end
f.with_instance_eval do |arg|
p self
# => #<Foo:0x100124b10>
p arg
# => #<Foo:0x100124b10>
end
2番目の「 p arg
」がFooインスタンスを報告するのはなぜですか? with_instance_eval
はブロックに self
を生成しないため、 nil
を報告すべきではありませんか?
解決
Ruby 1.8では、instance_evalはブロック内のselfの値をレシーバーに変更するだけでなく、その値も生成します。 1.9ではこれは当てはまりません(argはnilになります)。そのため、その動作に依存するべきではありません(ドキュメント化されていないことも確信しています)。
所属していません StackOverflow