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

What is the standalone splat operator (*) used for in Ruby?

我刚看到这个例子,其中 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 规范中定义的,那么它一定有一个用例吗?

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

您可以使用 Method#parameters:

检查方法的参数
method(:print_pair).parameters
#=> [[:req, :a], [:req, :b], [:rest]]

在参数列表中,*args表示"gobble up all the remaining arguments in an array and bind them to the parameter named args"。 * 表示 "gobble up all the remaining arguments and bind them to nothing",或者更简单地说 "ignore all remaining arguments".

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

def foo(*)
  # do something
  super
end

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