我有一个方法迭代一些记录并对它们做一些事情,可选择产生一个结果 - 类似于:
@evens = []
def foo(numbers)
numbers.each do |r|
even = r % 2 == 0
@evens << r if even
yield "#{r}: #{even}" if block_given?
end
end
Run Code Online (Sandbox Code Playgroud)
我有第二个方法来获取记录并将它们传递给第一个方法,类似于:
def bar(count)
numbers = (0..count).to_a
foo(numbers)
end
Run Code Online (Sandbox Code Playgroud)
我想更改此方法以获取可选块,从而产生第一种方法的结果.到目前为止我想出的是:
def bar(count)
numbers = (0..count).to_a
foo(numbers) do |result|
yield result if block_given?
end
end
Run Code Online (Sandbox Code Playgroud)
这感觉就像if block_given?我应该需要的两条线和一条支票.有没有更简洁的方式简单地说"产生任何这种方法调用产生,如果有的话"?
在Ruby中定义方法时,您还可以选择将块定义为特殊的命名参数:
def bar(count, &block)
#...
end
Run Code Online (Sandbox Code Playgroud)
然后,在该方法中,您可以将块(或通常:任何Proc对象)作为块传递给方法.因此,以下方法将完全等同于您的bar方法:
def bar(count, &block)
numbers = (0..count).to_a
foo(numbers, &block)
end
Run Code Online (Sandbox Code Playgroud)
请注意,即使&block在方法的签名中定义参数,也不必传递块.如果你没有传递一个,block将nil在方法体中.
| 归档时间: |
|
| 查看次数: |
254 次 |
| 最近记录: |