在Ruby中传递多个代码块作为参数

doc*_*nge 38 ruby yield

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

def opportunity
  @opportunities += 1
  if yield
    @performances +=1
  end
end
Run Code Online (Sandbox Code Playgroud)

我称之为:

opportunity { @some_array.empty? }

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

def opportunity
  if yield_1
    @opportunities += 1
  end
  if yield_2
    @performances +=1
  end
end
Run Code Online (Sandbox Code Playgroud)

和:

opportunity {@some_other_array.empty?} { @some_array.empty? }
Run Code Online (Sandbox Code Playgroud)

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

hor*_*guy 61

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

使用1.9语法:

opportunity ->{ @some_array.empty? }, ->{ @some_other_array.empty? }
Run Code Online (Sandbox Code Playgroud)

并在方法本身:

def opportunity(lambda1, lambda2)
  if lambda1.()
    @opportunities += 1
  end
  if lambda2.()
    @performances += 1
  end
end
Run Code Online (Sandbox Code Playgroud)

  • @MrYoshiji是的!http://ruby-doc.org/core-2.2.0/Proc.html#method-i-call"请注意,prc.()使用给定的参数调用prc.call().这是隐藏的语法糖"呼叫"." (3认同)