是否有可能(如果可以,如何)在Ruby方法中将块作为关键字参数传递?
基本上我想要做的是:
pippo(even: {|n| n+1 }, odd: {|n| n-1})
将该方法定义为如下
def pippo(even: , odd:)
even? ? even.yield(self) : odd.yield(self)
end
谢谢
是否有可能(如果可以,如何)在Ruby方法中将块作为关键字参数传递?
基本上我想要做的是:
pippo(even: {|n| n+1 }, odd: {|n| n-1})
将该方法定义为如下
def pippo(even: , odd:)
even? ? even.yield(self) : odd.yield(self)
end
谢谢
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.method(:succ)
is not equivalent to -> (n) { n + 1 }
- Stefann + 1
,另一个调用了1 + n
,但这个例子显然是关于整数的,所以没关系。 - Stefan-
不是可结合的。我还太早了。 - Jörg W Mittaglambda
构造声明它们:when(
even: -> (x) { x+1 },
odd: -> (x) { x-1 }
)
proc { ... }
或 lambda { ... }
来声明它们,这是相同的旧式声明方式。proc { ... }
,为什么还要使用 Proc.new { ... }
? :) - Sergio TulentsevKernel#proc
是Kernel#lambda
的别名,因此返回一个lambda。然后它被更改为基本上执行def proc(&blk) Proc.new(&blk) end
。但是,如果您不知道您的代码将在哪个Ruby版本上运行,您必须避免使用Kernel#proc
,因为您无法知道它会做什么。学习Ruby的Rubyist在2003年之前就因此避免使用Kernel#proc
,尽管那时已经淘汰了返回lambda的Ruby版本。 - Jörg W MittagProc
),因此任何在1.8和1.9并行使用的时期学习Ruby的人都倾向于避免使用它。 - Jörg W Mittag
when
是 Ruby 中的关键字。 - Stefanwhen
方法。 - Sig