将块作为关键字参数传递

时间:2016-11-02 07:17:05

标签: ruby

是否有可能(如果是的话)如何在ruby方法中将块作为关键字参数传递?

基本上,我想做

pippo(even: {|n| n+1 }, odd: {|n| n-1})

将方法定义为

def pippo(even: , odd:)
  even? ? even.yield(self) : odd.yield(self)
end

由于

2 个答案:

答案 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 { ... }声明它们,这是旧式声明。