Ruby中yield调用代码块时,块内的self指向什么对象?
你的判断完全正确。
Ruby 里的代码块是闭包,它的self指向、局部变量绑定都只和块定义时的上下文有关,和块的调用位置、调用方无关。
你提供的测试代码中,两层嵌套的块都是在顶层上下文(也就是main对象的作用域)中定义的,所以哪怕是被Klass实例的方法通过yield调用,块内部的self还是保留了定义时绑定的main,所以最后输出main符合 Ruby 的语法规则。
如果需要主动修改块执行时的self指向,可以用instance_eval/instance_exec方法手动绑定上下文,示例如下:
class Klass def yld(&block) # 把块的执行上下文绑定为当前Klass实例 instance_exec(&block) end end o1 = Klass.new o2 = Klass.new o1.yld { p self # 输出 #<Klass:xxxxxxx> 也就是o1对象 o2.yld { p self # 输出 #<Klass:yyyyyyy> 也就是o2对象 } }
普通的yield调用不会修改块原本绑定的上下文,所以不会改变self的指向。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

