在ruby中转发/委托2个参数

时间:2018-03-19 22:01:49

标签: ruby ruby-std

class MyClass
  extend Forwardable
  def_delegators :@broker, :add

  def subscribe_in_broker
    @subscribers.map(&method(:add))
  end
end

在此示例中,@subscribersHash@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

但是使用委托?

1 个答案:

答案 0 :(得分:1)

看起来块似乎正在接收2个参数,但它实际上只接收一个参数(一个2元素数组)。 Ruby正在解释|x, y|,就好像它是|(x, y)|一样。括号(这里可以省略)将单个参数解构为两部分。

当你对一个方法使用&时,它也只只获得一个参数,如果你想要对它进行解构,你必须通过使用一组括号来明确在xy附近:

def add((x,y))
end

要清楚,这是一个单参数方法,它希望参数是一个数组。例如,您可以这样称呼它:add([1, 2])

注意:这与与委托有关,只是Ruby假定你打算在一个地方进行解构,而不是在另一个地方进行解构。

可以为块生成多个参数(或者使用'&'转换为proc的方法),但这不是map所做的。

对我来说,hash.map { |x,y| add(x, y) }为什么不适合你的目的并不明显。要解决这个问题,你需要定义自己的map函数,它产生2个参数而不是1,这看起来有点过分了。

相关问题