Ruby 为什么第二个';p arg';报告Foo实例? class-Foo def与_产量 产量(自我) 终止 带有实例的def评估(&block) 实例求值(&block) 终止 终止 f=Foo.new f、 具有| do | arg的| p自我 #=>主要 p精氨酸 # => # 终止 f、 带有|实例|评估do |参数| p自我 # => # p精氨酸 # => # 终止
为什么第二个“Ruby 为什么第二个';p arg';报告Foo实例? class-Foo def与_产量 产量(自我) 终止 带有实例的def评估(&block) 实例求值(&block) 终止 终止 f=Foo.new f、 具有| do | arg的| p自我 #=>主要 p精氨酸 # => # 终止 f、 带有|实例|评估do |参数| p自我 # => # p精氨酸 # => # 终止,ruby,instance-eval,Ruby,Instance Eval,为什么第二个“p arg”报告Foo实例?它不应该报告nil,因为with_instance\u eval不会向块产生self。显然,在ruby 1.8中,instance\u eval不仅会将块内self的值更改为其接收器,还会产生该值。在1.9中不再是这种情况(arg将为零),因此不应该依赖行为(我也非常确定它是未记录的)。显然,在ruby 1.8中,实例eval不仅将块内self的值更改为它的接收者,它还产生该值。在1.9中,情况不再如此(arg将为零),因此不应依赖该行为(我也非常确定它
p arg
”报告Foo实例?它不应该报告nil
,因为with_instance\u eval
不会向块产生self
。显然,在ruby 1.8中,instance\u eval不仅会将块内self的值更改为其接收器,还会产生该值。在1.9中不再是这种情况(arg将为零),因此不应该依赖行为(我也非常确定它是未记录的)。显然,在ruby 1.8中,实例eval不仅将块内self的值更改为它的接收者,它还产生该值。在1.9中,情况不再如此(arg将为零),因此不应依赖该行为(我也非常确定它是未记录的)。哦,嘿,这是我的代码来源:)哦,嘿,这是我的代码来源:)
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