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

Ruby方法内仅定义一次yield为何两次调用输出不同结果

问题解答

你对yield作用逻辑的理解有偏差,搞懂两个基本规则就能想明白:

  • Ruby里每次方法调用都是完全独立的执行上下文,调用方法时后面跟的do...end块,只绑定到紧挨着它前面的那一次方法调用,不会跨调用共享,也不会被其他次调用读取。
  • yield本身没有记忆功能,它在方法里执行时,永远只会调用「当前这次方法运行时,和它绑定的传入块」,取这个块的返回值使用。

顺着执行顺序捋你的代码逻辑就非常清楚:

  1. 代码从上到下运行,首先碰到第一个make_casserole调用,它后面跟着的块返回"noodles, celery, and tuna",这个块只属于这次调用:
    • 进入方法先输出预热烤箱到375度的提示
    • 执行yield触发这次调用绑定的块,拿到对应食材字符串
    • 依次输出放食材、烘烤20分钟的提示,第一次方法执行完毕,退出方法流程
  2. 第一次方法彻底运行结束后,代码才会继续向下执行,碰到第二个make_casserole调用,这次它后面跟着的是另一个完全独立的块,返回"rice, broccoli, and chicken",这个块只属于第二次调用:
    • 重新进入方法,再输出一遍预热提示
    • 执行yield触发第二次调用自己绑定的块,拿到新的食材字符串
    • 再依次输出放食材、烘烤20分钟的提示,第二次方法执行完毕。

你之前预期只输出一次,本质是误以为第二个make_casserole带的块是第一次调用的一部分,但实际上这是两次平级的、完全独立的方法调用,每次都传了自己专属的块,自然会完整跑两遍流程,输出两组结果。


内容的提问来源于stack exchange,提问作者Forest

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:31:17