Question

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

Pourquoi le second ' p arg ' rapporte-t-il l'instance Foo? Ne devrait-il pas indiquer nil , car with_instance_eval ne renvoie pas self au bloc?

Était-ce utile?

La solution

Apparemment, dans ruby ??1.8 instance_eval ne modifie pas seulement la valeur de self à l'intérieur du bloc en fonction de son récepteur, il génère également cette valeur. En 1.9, ce n’est plus le cas (arg y sera nul), de sorte que le comportement ne doit pas être invoqué (je suis également certain que cela n’est pas documenté).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top