두 번째 'p arg'가 Foo 인스턴스를보고하는 이유는 무엇입니까?
-
07-07-2019 - |
문제
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은 블록 내부의 자체 값을 수신기로 바꿀뿐만 아니라 그 가치도 산출합니다. 1.9에서 이것은 더 이상 사건이 아닙니다 (Arg는 거기에 없을 것입니다). 따라서 행동은 의존해서는 안됩니다 (또한 문서화되지 않은 것도 확실합니다).
제휴하지 않습니다 StackOverflow