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

Dav*_*les 1 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
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?我应该需要的两条线和一条支票.有没有更简洁的方式简单地说"产生任何这种方法调用产生,如果有的话"?

Hol*_*ust 5

在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在方法的签名中定义参数,也不必传递块.如果你没有传递一个,blocknil在方法体中.