题
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
到块?
解决方案
显然在ruby 1.8中,instance_eval不仅会将块内的self值更改为接收者,还会产生该值。在1.9中不再是这种情况(arg将在那里为零),所以不应该依赖这种行为(我也很确定它没有文档记录)。
不隶属于 StackOverflow