我有一个迭代某些记录的方法,并对它们做一些事情,可选择产生一个结果 - 类似于:
@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?
检查。有没有更简洁的方式简单地说&#34;产生任何这种方法调用产生的东西,如果有的话&#34;?
答案 0 :(得分:5)
在Ruby中定义方法时,您还可以选择将块定义为特殊的命名参数:
def bar(count, &block)
#...
end
然后,在该方法中,您可以将块(或通常:任何Proc对象)作为块传递给方法。因此,以下方法将完全等同于您的bar
方法:
def bar(count, &block)
numbers = (0..count).to_a
foo(numbers, &block)
end
请注意,即使在方法签名中定义&block
参数,也不必传递块。如果您没有通过,block
将在方法正文中nil
。