gpt4 book ai didi

ruby - 在 Ruby 中是否有用于链接 yield 调用的简洁语法?

转载 作者:太空宇宙 更新时间:2023-11-03 17:31:18 24 4
gpt4 key购买 nike

我有一个方法可以遍历一些记录并对它们做一些事情,可以选择产生一个结果——类似于:

@evens = []
def foo(numbers)
numbers.each do |r|
even = r % 2 == 0
@evens << r if even
yield "#{r}: #{even}" if block_given?
end
end

我有第二种方法可以获取记录并将它们传递给第一种方法,类似于:

def bar(count)
numbers = (0..count).to_a
foo(numbers)
end

我想将此方法更改为也采用可选 block ,从而产生第一种方法的结果。到目前为止我想出了什么:

def bar(count)
numbers = (0..count).to_a
foo(numbers) do |result|
yield result if block_given?
end
end

这感觉比我应该需要的多了两行和多了一个 if block_given? 检查。有没有一种更简洁的方式来简单地说“如果有的话,就产生这个方法调用产生的任何东西”?

最佳答案

在 Ruby 中定义方法时,您还可以选择将 block 定义为特殊的命名参数:

def bar(count, &block)
#...
end

然后,在方法中,您可以将 block (或通常:任何 Proc 对象)作为 block 传递给方法。因此,以下方法将完全等同于您的 bar 方法:

 def bar(count, &block)
numbers = (0..count).to_a
foo(numbers, &block)
end

请注意,即使在方法签名中定义了 &block 参数,也不一定要传递 block 。如果您不传递一个,block 将在方法主体中为 nil

关于ruby - 在 Ruby 中是否有用于链接 yield 调用的简洁语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36023600/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com