Maybe this is a stupid question, but I can't figure it out. I have a "feeling" why main
is self
during execution of the block. But I don't have a solid explanation for it.
It seems that the question who is self
depends on the context where the block is defined. Is this right?
Can anyone explain it to me?
?> class Klass
?> def yld
?> yield
?> end
>> end
>>
>> o1 = Klass.new
>> o2 = Klass.new
>>
?> o1.yld {
?> o2.yld {
?> p self
?> }
>> }
main
CodePudding user response:
self
doesn't change because of a block. The reason you get main
is because you are calling yld
from the main context:
p self #=> main
o1.yld {
p self #=> main
o2.yld {
p self #=> main
}
p self #=> main
}
p self #=> main
However, self
can be changed explicitly, e.g. via instance_eval
:
def foo(&block)
"hello".instance_eval(&block)
end
p self #=> main
foo {
p self #=> "hello"
p size #=> 5
p upcase #=> "HELLO"
}
p self #=> main
In the above code, self
is changed to the string instance "hello"
during the block.