class MyClass
extend Forwardable
def_delegators :@broker, :add
def subscribe_in_broker
@subscribers.map(&method(:add))
end
end
在此示例中,@subscribers
是Hash
,@broker.add
有两个参数:def broker(k,v)
。
这会导致ArgumentError: wrong number of arguments (given 1, expected 2)
有没有办法在没有这个问题的情况下使用Forwardable
或类似的解决方案?如何轻松地将带有2个元素的数组委托给带有两个参数的方法?什么相当于写作:
def subscribe_in_broker
@subscribers.map{|k,v| add(k,v) }
end
但是使用委托?
答案 0 :(得分:1)
看起来块似乎正在接收2个参数,但它实际上只接收一个参数(一个2元素数组)。 Ruby正在解释|x, y|
,就好像它是|(x, y)|
一样。括号(这里可以省略)将单个参数解构为两部分。
当你对一个方法使用&
时,它也只只获得一个参数,如果你想要对它进行解构,你必须通过使用一组括号来明确在x
和y
附近:
def add((x,y))
end
要清楚,这是一个单参数方法,它希望参数是一个数组。例如,您可以这样称呼它:add([1, 2])
注意:这与无与委托有关,只是Ruby假定你打算在一个地方进行解构,而不是在另一个地方进行解构。
可以为块生成多个参数(或者使用'&'转换为proc的方法),但这不是map
所做的。
对我来说,hash.map { |x,y| add(x, y) }
为什么不适合你的目的并不明显。要解决这个问题,你需要定义自己的map
函数,它产生2个参数而不是1,这看起来有点过分了。