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