将块作为关键字参数传递

Sig*_*Sig 3 ruby

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

基本上,我想做

pippo(even: {|n| n+1 }, odd: {|n| n-1})
Run Code Online (Sandbox Code Playgroud)

将方法定义为此类

def pippo(even: , odd:)
  even? ? even.yield(self) : odd.yield(self)
end
Run Code Online (Sandbox Code Playgroud)

谢谢

Jör*_*tag 5

不,这是不可能的.块不是对象,除了作为块参数之外,不能将它们作为参数传递.它们是一种轻量级的语法和语义结构,允许作为消息发送的块参数.块的轻量级基于以下事实:最多可以存在一个块,因此不需要命名和/或绑定到参数.

但是,你可以做的是传递多个Procs或lambdas.毕竟,Procs和lambdas是任何其他对象的对象,因此您可以像任何其他对象一样将它们作为参数传递:

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

def pippo(even: , odd:)
  if even? then even.(self) else odd.(self) end
end
Run Code Online (Sandbox Code Playgroud)

实际上,这允许您传递响应的任何对象call,例如Method:

pippo(even: 1.method(:+), odd: 1.method(:-))
Run Code Online (Sandbox Code Playgroud)