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

Is there a concise syntax for chaining yield calls in Ruby?

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

@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

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

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

这感觉比我应该需要的多了两行和一个 if block_given? 检查。有没有更简洁的方式来简单地说 "yield whatever this method call yields, if anything"?

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

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

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

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

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