Pourquoi le second "p arg" rapporte-t-il l'instance Foo?
-
07-07-2019 - |
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?
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