2009-09-15 2 views
1
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 блоку?Почему второй «p arg» сообщает экземпляр Foo?

+0

О, эй, это мой код от http://stackoverflow.com/questions/1425055/is-yield-self-the-same-as-instanceeval/1425600#1425600 :) –

ответ

4

По-видимому, в ruby ​​1.8 instance_eval не только изменяет значение self внутри блока на его приемник, но и дает это значение. В 1.9 это уже не так (arg будет нуль там), так что на поведение не следует полагаться (я также уверен, что он недокументирован).