将哈希传递给函数(* args)及其含义

时间:2010-09-13 14:17:15

标签: ruby

使用如下的习语时:

def func(*args)
  # some code
end

*args的含义是什么?谷歌搜索这个具体问题非常困难,我找不到任何东西。

似乎所有的论点实际上都出现在args[0]中,所以我发现自己编写了防御性代码,例如:

my_var = args[0].delete(:var_name) if args[0]

但我确信我错过了一种更好的方式。

1 个答案:

答案 0 :(得分:98)

* splat (或星号)运算符。在方法的上下文中,它指定可变长度参数列表。在您的情况下,传递给func的所有参数都将放入名为args的数组中。您还可以在可变长度参数之前指定特定参数,如下所示:

def func2(arg1, arg2, *other_args)
  # ...
end

假设我们称这种方法为:

func2(1, 2, 3, 4, 5)

如果您现在在arg1内检查arg2other_argsfunc2,您将获得以下结果:

def func2(arg1, arg2, *other_args)
  p arg1.inspect       # => 1
  p arg2.inspect       # => 2
  p other_args.inspect # => [3, 4, 5]
end

在您的情况下,您似乎将哈希作为参数传递给func,在这种情况下,args[0]将包含哈希值,正如您所观察到的那样。

资源:


根据OP的评论进行更新

如果要将哈希作为参数传递,则不应使用splat运算符。 Ruby允许你在方法调用中省略括号,包括那些指定哈希(带警告,继续阅读)的括号。因此:

my_func arg1, arg2, :html_arg => value, :html_arg2 => value2

相当于

my_func(arg1, arg2, {:html_arg => value, :html_arg2 => value2})

当Ruby在你的参数列表中看到=>运算符时,它知道将参数作为哈希,即使没有明确的{...}表示法(请注意,这只适用于哈希参数为最后一个!)。

如果要收集此哈希,则不必执行任何特殊操作(尽管您可能希望将空哈希指定为方法定义中的默认值):

def my_func(arg1, arg2, html_args = {})
  # ...
end