Ruby方法内仅定义一次yield为何两次调用输出不同结果
问题解答
你对yield作用逻辑的理解有偏差,搞懂两个基本规则就能想明白:
- Ruby里每次方法调用都是完全独立的执行上下文,调用方法时后面跟的
do...end块,只绑定到紧挨着它前面的那一次方法调用,不会跨调用共享,也不会被其他次调用读取。 yield本身没有记忆功能,它在方法里执行时,永远只会调用「当前这次方法运行时,和它绑定的传入块」,取这个块的返回值使用。
顺着执行顺序捋你的代码逻辑就非常清楚:
- 代码从上到下运行,首先碰到第一个
make_casserole调用,它后面跟着的块返回"noodles, celery, and tuna",这个块只属于这次调用:- 进入方法先输出预热烤箱到375度的提示
- 执行
yield触发这次调用绑定的块,拿到对应食材字符串 - 依次输出放食材、烘烤20分钟的提示,第一次方法执行完毕,退出方法流程
- 第一次方法彻底运行结束后,代码才会继续向下执行,碰到第二个
make_casserole调用,这次它后面跟着的是另一个完全独立的块,返回"rice, broccoli, and chicken",这个块只属于第二次调用:- 重新进入方法,再输出一遍预热提示
- 执行
yield触发第二次调用自己绑定的块,拿到新的食材字符串 - 再依次输出放食材、烘烤20分钟的提示,第二次方法执行完毕。
你之前预期只输出一次,本质是误以为第二个make_casserole带的块是第一次调用的一部分,但实际上这是两次平级的、完全独立的方法调用,每次都传了自己专属的块,自然会完整跑两遍流程,输出两组结果。
内容的提问来源于stack exchange,提问作者Forest
相关产品推荐
相关产品推荐

