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

Sev*_*rin 3 ruby splat

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

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

print_pair(1,2,3,:cake,7)
#=> 1 and 2
Run Code Online (Sandbox Code Playgroud)

很明显你会在这样的上下文中使用它的原因和原因如下:

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}
Run Code Online (Sandbox Code Playgroud)

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

Jör*_*tag 9

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

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

def foo(*)
  # do something
  super
end
Run Code Online (Sandbox Code Playgroud)

请记住:super没有参数列表会传递未经修改的参数.所以,尽管这个倍率foo忽视的论点,他们仍然可以在父类的方法的实现; 然而,该定义清楚地表明这种实现并不关心.