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 arg' 报告 Foo 实例?它不应该报告nil,因为with_instance_eval它不屈服于self区块吗?

4

1 回答 1

4

显然,在 ruby​​ 1.8 instance_eval 不仅将块内的 self 的值更改为它的接收者,它还产生了该值。在 1.9 中不再是这种情况(arg 将在那里为零),因此不应依赖这种行为(我也很确定它是无证的)。

于 2009-09-15T17:34:43.387 回答