在 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
在方法体中。
我有一个方法可以遍历一些记录并对它们做一些事情,可以选择产生一个结果——类似于:
@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
在方法体中。