You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 10:03:03