首页 > 解决方案 > Ruby:在屈服期间,谁是块内的自我?

问题描述

也许这是一个愚蠢的问题,但我无法弄清楚。我有一种“感觉”,为什么mainself在执行块期间。但我没有一个可靠的解释。

似乎是谁的问题self取决于定义块的上下文。这是正确的吗?

谁能给我解释一下?

?> class Klass
?>   def yld
?>     yield
?>   end
>> end

>>
>> o1 = Klass.new
>> o2 = Klass.new
>>
?> o1.yld {
?>   o2.yld {
?>     p self
?>   }
>> }
main

标签: rubyscopeself

解决方案


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"


推荐阅读