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
相关产品推荐
相关产品推荐

