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

Ruby如何正确使用yield将匿名代码块传递给Integer#times方法?

解决Ruby中用yield传递代码块给Integer#times的问题

嘿,我来帮你搞定这个代码块传递的问题!你之前用命名代码块的写法是对的,但想用yield实现时踩了个小坑,咱们一步步理清楚。

为什么你的尝试失败了?

你写的def withYield; 3.times(&yield); end之所以不行,是因为yield在这里会立刻执行你传入的代码块,然后把代码块执行后的返回值(比如你例子里print "Go "返回的是nil)转换成Proc对象传给times——这显然不是你想要的,你是希望times每次迭代都调用这个代码块,而不是传个无效的nil过去。

正确的实现方式

方式一:在times的块内调用yield

这是最直观常用的写法,直接让times每次迭代时都触发yield,也就是调用你传入的代码块:

def withYield
  3.times { yield }
end

withYield { print "Go " } # 输出:Go Go Go

每次times循环一次,就会执行一次你传入的{ print "Go " }代码块,完美达到指定次数调用的需求。

方式二:直接传递代码块对象给times

如果你想和命名代码块的逻辑更贴近,把整个代码块对象传给times,可以用proc关键字获取当前方法接收的隐式代码块,再转成块传给times:

def withYield
  3.times(&proc)
end

withYield { print "Go " } # 同样输出:Go Go Go

这里的proc会把方法隐式接收的代码块转换成Proc对象,&符号则把这个Proc转成times能接收的块参数,效果和你用命名代码块的写法完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:23:12