如何将更多的代码块传递给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
然而,它很少有意义。
答
在句法上,使用yield
语句只支持一个传递给该函数的代码块。当然,您可以传递多个其他函数或“代码块对象”(Proc
对象)的函数,并使用它们,但不能简单地使用yield
。
答
可以使用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} !"}
块不完全是过程。他们有共同的使用情况和语法,但他们有足够的实现差异导致混淆行为。这有点迂腐,但范围的差异已经让我陷入了困境。 – fengb 2009-11-25 14:25:49
@fengb我刚做了一个测试。 http://gist.github.com/242746您是否有更多关于Proc和block之间差异的文档? Ruby告诉我一个块是Proc。 – 2009-11-25 14:31:51
通过使用&var语法,块被隐式地“typecasted”处理。但是,某些操作在作为块与proc使用时表现出不同的行为。 冗长而全面的比较: http://innig.net/software/ruby/closures-in-ruby.rb – fengb 2009-11-25 15:00:11