【问题标题】:Is there a concise syntax for chaining yield calls in Ruby?在 Ruby 中链接 yield 调用是否有简洁的语法?
【发布时间】:2016-07-01 14:52:48
【问题描述】:

我有一个方法可以遍历一些记录并用它们做一些事情,可选地产生一个结果——类似于:

@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? 检查。有没有更简洁的方式来简单地说“让这个方法调用产生的任何东西,如果有的话”?

【问题讨论】:

    标签: ruby yield


    【解决方案1】:

    在 Ruby 中定义方法时,您还可以选择将块定义为特殊的命名参数:

    def bar(count, &block)
      #...
    end
    

    然后,在方法中,您可以将块(或通常:任何 Proc 对象)作为块传递给方法。因此,以下方法将完全等效于您的 bar 方法:

     def bar(count, &block)
      numbers = (0..count).to_a
      foo(numbers, &block)
    end
    

    请注意,即使在方法的签名中定义了&amp;block 参数,也不一定要传递块。如果你没有通过一个,block 在方法体中将是nil

    【讨论】:

    • 好吧,我会的,这该死的东西就行了。对于一个红宝石新手来说,也许不是最易读的东西,但它确实做到了它在锡上所说的那样。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    相关资源
    最近更新 更多