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

时间:2016-03-15 22:38:42

标签: ruby yield

我有一个迭代某些记录的方法,并对它们做一些事情,可选择产生一个结果 - 类似于:

@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;?

1 个答案:

答案 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