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"