如何将更多的代码块传递给Ruby中的函数?

时间:2009-11-25 14:06:13

标签: ruby

我不知道任何Ruby,现在正在阅读一些文档。 在阅读有关使用代码块和“yield”关键字之后我怀疑是否可以将多个代码块传递给函数,并且在被调用函数中随意使用这两个代码块。

4 个答案:

答案 0 :(得分:9)

您一次只能传递一个块,但块实际上是Proc个实例,您可以传递任意数量的实例作为参数。

def mymethod(proc1, proc2, &block)
  proc1.call
  yield if block_given?
  proc2.call
end

mymethod(Proc.new {}, Proc.new {}) do
  # ...
end

然而,它很少有意义。

答案 1 :(得分:1)

从语法上讲,使用yield语句只支持一个传递给函数的代码块。

当然,您可以传递一个函数多个其他函数或“代码块对象”(Proc个对象),并使用它们,但不能只使用yield

答案 2 :(得分:1)

您可以创建Proc个对象并传递任意数量的对象。

我建议阅读this page以了解Ruby所具有的所有不同块和闭包构造的细微之处。

答案 3 :(得分:1)

您可以使用call方法而不是yield来处理传入的两个单独的块。

以下是:

def mood(state, happy, sad )
  if (state== :happy)
    happy.call
  else
    sad.call
  end
end

mood(:happy, Proc.new {puts 'yay!'} , Proc.new {puts 'boo!'})
mood(:sad, Proc.new {puts 'yay!'} , Proc.new {puts 'boo!'})

您可以传递args,例如:

happy.call('very much')

参数就像你在块中所期望的那样工作:

Proc.new {|amount| puts "yay #{amount} !"}