如何在Ruby中传递splat参数

时间:2016-03-03 09:22:50

标签: ruby

给定一个具有接受splat的方法的类,例如从ActiveRecord::FinderMethods得到的方法:

class Settle
  def self.find(*args)
  end
end

我应该如何从另一个方法调用该方法,比如另一个类,以便它具有完全相同的签名?

class Settler
  def self.find(*args)
    Settle.find(*args)
  end
end

class Settler
  def self.find(*args)
    Settle.find(args)
  end
end

还是其他什么? 请注意,完全相同的签名是重要的部分:Settler.find应与Settle.find完全相同。

然而,对于允许Settler.find签名在Settle.find变为完全不同的内容时神奇地更新的代码,我并不感兴趣,例如, .find(scope, *args)。在这种情况下,更新Settler中的版本是没有问题的。

1 个答案:

答案 0 :(得分:4)

应该是

Settle.find(*args)

这样,传递给Settler.find的所有参数也会传递给Settle.find并存储在其中的args数组中。所以两个方法中的args数组都保持相同的值。

将参数传递为' splat'很简单 - 它只是将数组作为单独的参数传递。所以,如果你有

ar = [arg1, arg2, arg3, ..., argn]

调用

some_method(*ar)

相当于

some_method(arg1, arg2, arg3, ..., argn)