什么是Ruby中使用的独立splat运算符(*)?

时间:2017-02-10 11:13:59

标签: ruby splat

我刚刚遇到了这个示例,其中splat运算符在方法定义中单独使用:

def print_pair(a,b,*)
  puts "#{a} and #{b}"
end

print_pair(1,2,3,:cake,7)
#=> 1 and 2

很清楚你会在这样的环境中使用它的原因和原因:

def arguments_and_opts(*args, opts)
  puts "arguments: #{args} options: #{opts}"
end

arguments_and_opts(1,2,3, a: 5)
#=> arguments: [1, 2, 3] options: {:a=>5}

但是为什么以及如何在第一个例子中使用它呢?既然它是在Ruby规范中定义的那么必须有一个用例吗?

2 个答案:

答案 0 :(得分:7)

在参数列表中,*args表示“吞噬数组中所有剩余的参数并将它们绑定到名为args的参数”。 *意味着“吞噬所有剩余的参数并将它们绑定到任何东西”,或者更简单地“忽略所有剩余的参数”。

这就是你要使用它的时候:当你想忽略所有剩下的参数时。要么因为你不关心关于他们,要么因为不关心他们(或其他人可能):

def foo(*)
  # do something
  super
end

请记住:没有参数列表的super会传递未经修改的参数。因此,即使这个覆盖foo忽略了参数,它们仍然可用于超类的方法实现;然而,该定义清楚地表明实现并不关心。

答案 1 :(得分:0)

使用强调,该方法需要两个参数,但您可以传递任何数量(rest将被忽略)。

您可以使用Method#parameters检查方法的参数:

method(:print_pair).parameters
#=> [[:req, :a], [:req, :b], [:rest]]