1
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

p arg2番目の' 'がFooインスタンスを報告するのはなぜですか?ブロックに譲らないnilので報告すべきではありませんか?with_instance_evalself

4

1 に答える 1

4

どうやらruby1.8では、instance_evalはブロック内のselfの値をそのレシーバーに変更するだけでなく、その値も生成します。1.9では、これはもはや当てはまりません(argはそこでnilになります)ので、動作に依存するべきではありません(文書化されていないこともかなり確信しています)。

于 2009-09-15T17:34:43.387 に答える