使用如下的习语时:
def func(*args)
# some code
end
*args
的含义是什么?谷歌搜索这个具体问题非常困难,我找不到任何东西。
似乎所有的论点实际上都出现在args[0]
中,所以我发现自己编写了防御性代码,例如:
my_var = args[0].delete(:var_name) if args[0]
但我确信我错过了一种更好的方式。
答案 0 :(得分:98)
*
是 splat (或星号)运算符。在方法的上下文中,它指定可变长度参数列表。在您的情况下,传递给func
的所有参数都将放入名为args
的数组中。您还可以在可变长度参数之前指定特定参数,如下所示:
def func2(arg1, arg2, *other_args)
# ...
end
假设我们称这种方法为:
func2(1, 2, 3, 4, 5)
如果您现在在arg1
内检查arg2
,other_args
和func2
,您将获得以下结果:
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