使用成语时如:
def func(*args)
# some code
end
Run Code Online (Sandbox Code Playgroud)
是什么意思*args?谷歌搜索这个具体问题非常困难,我找不到任何东西.
似乎所有的论点都出现了,args[0]所以我发现自己编写的防御性代码如下:
my_var = args[0].delete(:var_name) if args[0]
Run Code Online (Sandbox Code Playgroud)
但我确信我错过了更好的方式.
Dan*_*uis 103
的*是图示(或星号)运算符.在方法的上下文中,它指定可变长度参数列表.在您的情况下,传递给的所有参数func都将放入一个名为的数组中args.您还可以在可变长度参数之前指定特定参数,如下所示:
def func2(arg1, arg2, *other_args)
# ...
end
Run Code Online (Sandbox Code Playgroud)
假设我们称这种方法为:
func2(1, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)
如果您检查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
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您似乎将哈希作为参数传递给您func,在这种情况下,args[0]将包含哈希值,正如您所观察到的那样.
资源:
根据OP的评论进行更新
如果要将哈希作为参数传递,则不应使用splat运算符.Ruby允许您省略括号,包括在方法调用中指定哈希(带有警告,继续阅读)的括号.因此:
my_func arg1, arg2, :html_arg => value, :html_arg2 => value2
Run Code Online (Sandbox Code Playgroud)
相当于
my_func(arg1, arg2, {:html_arg => value, :html_arg2 => value2})
Run Code Online (Sandbox Code Playgroud)
当Ruby =>在你的参数列表中看到运算符时,它知道将参数作为哈希,即使没有明确的{...}表示法(请注意,这只适用于哈希参数是最后一个!).
如果要收集此哈希,则不必执行任何特殊操作(尽管您可能希望将空哈希指定为方法定义中的默认值):
def my_func(arg1, arg2, html_args = {})
# ...
end
Run Code Online (Sandbox Code Playgroud)