【问题标题】:What is the standalone splat operator (*) used for in Ruby?Ruby 中使用的独立 splat 运算符 (*) 是什么?
【发布时间】:2017-02-10 11:13:58
【问题描述】:

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

【问题讨论】:

标签: ruby splat


【解决方案1】:

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

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

def foo(*)
  # do something
  super
end

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-04
      • 2013-08-19
      • 2010-10-21
      • 2020-10-22
      • 2021-12-04
      • 2011-03-02
      • 2020-03-13
      • 1970-01-01
      相关资源
      最近更新 更多