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

48

我有一个接受代码块的方法。

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来完成,但这只是为了说明问题。

1个回答

72

你无法直接传递多个块,但是你可以传递多个procs或lambdas:

使用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

有没有其他声明函数的方式? - user5020
1
Proc.new {} 或 lambda {} 也可以。任何响应 call 的对象都可以工作。 - Kylee
1
.() 方法是 .call 的别名吗? - MrYoshiji
4
是的!http://ruby-doc.org/core-2.2.0/Proc.html#method-i-call "请注意,prc.()会使用给定的参数调用prc.call()。 这是一种语法糖,以隐藏“call”方法。" - Darth Egregious

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接