为什么第二个'p arg'会报告Foo实例?

时间:2009-09-15 17:05:13

标签: ruby instance-eval

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 arg'会报告Foo实例?它不应该报告nil,因为with_instance_eval不会产生self块?

1 个答案:

答案 0 :(得分:4)

显然在ruby 1.8中,instance_eval不仅会将块内的self值更改为接收者,还会产生该值。在1.9中不再是这种情况(arg将在那里为零),所以不应该依赖这种行为(我也很确定它没有文档记录)。