Ruby: 屈服时,谁在区块内?
Ruby: Who is self inside a block during yielding?
也许这是一个愚蠢的问题,但我想不通。我有一种“感觉”,为什么 main
在块执行期间是 self
。但是我没有一个可靠的解释。
看来self
是谁的问题要看block定义的上下文。这样对吗?
谁能给我解释一下?
?> class Klass
?> def yld
?> yield
?> end
>> end
>>
>> o1 = Klass.new
>> o2 = Klass.new
>>
?> o1.yld {
?> o2.yld {
?> p self
?> }
>> }
main
self
不会因为块而改变。你得到 main
的原因是因为你从主上下文调用 yld
:
p self #=> main
o1.yld {
p self #=> main
o2.yld {
p self #=> main
}
p self #=> main
}
p self #=> main
但是,self
可以显式更改,例如通过 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
在上面的代码中,self
在块中被更改为字符串实例 "hello"
。
也许这是一个愚蠢的问题,但我想不通。我有一种“感觉”,为什么 main
在块执行期间是 self
。但是我没有一个可靠的解释。
看来self
是谁的问题要看block定义的上下文。这样对吗?
谁能给我解释一下?
?> class Klass
?> def yld
?> yield
?> end
>> end
>>
>> o1 = Klass.new
>> o2 = Klass.new
>>
?> o1.yld {
?> o2.yld {
?> p self
?> }
>> }
main
self
不会因为块而改变。你得到 main
的原因是因为你从主上下文调用 yld
:
p self #=> main
o1.yld {
p self #=> main
o2.yld {
p self #=> main
}
p self #=> main
}
p self #=> main
但是,self
可以显式更改,例如通过 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
在上面的代码中,self
在块中被更改为字符串实例 "hello"
。