2番目の「p arg」がFooインスタンスを報告するのはなぜですか?

StackOverflow https://stackoverflow.com/questions/1428434

  •  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になります)。そのため、その動作に依存するべきではありません(ドキュメント化されていないことも確信しています)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top