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

问题描述:

我不知道任何Ruby,现在正在阅读一些文档。 我刚刚阅读了关于使用代码块并且“yield”关键字的一个疑问,那就是是否可以将多个代码块传递给一个函数,并且可以在被调用的函数中同时使用这两个代码块。如何将更多的代码块传递给Ruby中的函数?

一次只能传递一个块,但块实际上是Proc实例,并且您可以传递许多希望作为参数的实例。

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

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

然而,它很少有意义。

+1

块不完全是过程。他们有共同的使用情况和语法,但他们有足够的实现差异导致混淆行为。这有点迂腐,但范围的差异已经让我陷入了困境。 – fengb 2009-11-25 14:25:49

+0

@fengb我刚做了一个测试。 http://gist.github.com/242746您是否有更多关于Proc和block之间差异的文档? Ruby告诉我一个块是Proc。 – 2009-11-25 14:31:51

+0

通过使用&var语法,块被隐式地“typecasted”处理。但是,某些操作在作为块与proc使用时表现出不同的行为。 冗长而全面的比较: http://innig.net/software/ruby/closures-in-ruby.rb – fengb 2009-11-25 15:00:11

在句法上,使用yield语句只支持一个传递给该函数的代码块。当然,您可以传递多个其他函数或“代码块对象”(Proc对象)的函数,并使用它们,但不能简单地使用yield

您可以创建Proc对象并传递尽可能多的数据。

我推荐阅读this page来理解Ruby所有不同的块和闭包构造的细微之处。

可以使用call方法,而不是产量,以处理传入了两个独立的模块

方法如下:。

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} !"}