是否有可能(如果是的话)如何在ruby方法中将块作为关键字参数传递?
基本上,我想做
pippo(even: {|n| n+1 }, odd: {|n| n-1})
将方法定义为
def pippo(even: , odd:)
even? ? even.yield(self) : odd.yield(self)
end
由于
答案 0 :(得分:5)
不,这是不可能的。块不是对象,您不能将它们作为参数传递,除了作为块参数。它们是一种轻量级的语法和语义结构,只允许 作为消息发送的块参数。块的轻量级取决于最多可以存在一个块的事实,因此不需要命名和/或绑定到参数。
可以做的是传递多个Proc
或lambdas。毕竟,Proc
和lambda是任何其他对象的对象,所以你可以像任何其他对象一样将它们作为参数传递:
pippo(even: -> n { n+1 }, odd: -> n { n-1 })
def pippo(even: , odd:)
if even? then even.(self) else odd.(self) end
end
实际上,这允许您传递响应call
的任何对象,例如Method
:
pippo(even: 1.method(:+), odd: 1.method(:-))
答案 1 :(得分:4)
如果要提供多个块,则需要将它们作为Proc传递,或使用lambda
构造声明它们:
when(
even: -> (x) { x+1 },
odd: -> (x) { x-1 }
)
您也可以使用proc { ... }
或lambda { ... }
声明它们,这是旧式声明。