【发布时间】:2009-11-25 14:06:13
【问题描述】:
我不知道任何 Ruby,现在正在阅读一些关于它的文档。 在阅读了关于使用代码块和“yield”关键字之后,我有一个疑问是是否可以将多个代码块传递给一个函数,并在被调用的函数中随意使用两者。
【问题讨论】:
标签: 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。
【讨论】:
您可以创建Proc 对象并传递任意数量的对象。
我建议阅读 this page 以了解 Ruby 具有的所有不同的类似块和类似闭包的构造的微妙之处。
【讨论】:
您可以使用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!'})
你可以传递参数,例如:
happy.call('very much')
参数的工作方式与您在块中所期望的一样:
Proc.new {|amount| puts "yay #{amount} !"}
【讨论】: