두 번째 'p arg'가 Foo 인스턴스를보고하는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1428434

  •  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는 거기에 없을 것입니다). 따라서 행동은 의존해서는 안됩니다 (또한 문서화되지 않은 것도 확실합니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top