【问题标题】:Passing multiple code blocks as arguments in Ruby在 Ruby 中将多个代码块作为参数传递
【发布时间】:2011-01-28 15:33:49
【问题描述】:

我有一个采用代码块的方法。

def opportunity
  @opportunities += 1
  if yield
    @performances +=1
  end
end

我这样称呼它:

opportunity { @some_array.empty? }

但是我如何传递多个代码块以便我可以使用两次 yield,如下所示:

def opportunity
  if yield_1
    @opportunities += 1
  end
  if yield_2
    @performances +=1
  end
end

和:

opportunity {@some_other_array.empty?} { @some_array.empty? }

我知道这个例子可以在没有 yield 的情况下完成,但这只是为了说明。

【问题讨论】:

    标签: ruby yield


    【解决方案1】:

    您本身不能传递多个块,但您可以传递多个 proc 或 lambda:

    使用 1.9 语法:

    opportunity ->{ @some_array.empty? }, ->{ @some_other_array.empty? }
    

    在方法本身中:

    def opportunity(lambda1, lambda2)
      if lambda1.()
        @opportunities += 1
      end
      if lambda2.()
        @performances += 1
      end
    end
    

    【讨论】:

    • 是否有其他方式来声明该函数
    • Proc.new {} 或 lambda {} 也可以。任何响应call 的对象都可以工作
    • 方法.().call的别名吗?
    • @MrYoshiji 是的! ruby-doc.org/core-2.2.0/Proc.html#method-i-call " 请注意 prc.() 使用给定的参数调用 prc.call()。这是隐藏“调用”的语法糖。”
    猜你喜欢
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多