使用成语时,例如:
def func(*args)
# some code
end
*args
是什么意思?在谷歌上搜索这个特定的问题相当困难,我什么也找不到.
似乎所有的论点都出现在args[0]
中,所以我发现自己在写防御代码,比如:
my_var = args[0].delete(:var_name) if args[0]
但我相信我错过了一个更好的方法.
使用成语时,例如:
def func(*args)
# some code
end
*args
是什么意思?在谷歌上搜索这个特定的问题相当困难,我什么也找不到.
似乎所有的论点都出现在args[0]
中,所以我发现自己在写防御代码,比如:
my_var = args[0].delete(:var_name) if args[0]
但我相信我错过了一个更好的方法.
*
是splat(或星号)运算符.在方法的上下文中,它指定一个可变长度的参数列表.在您的例子中,传递给func
的所有参数都将被放入一个名为args
的数组中.也可以在可变长度参数之前指定特定参数,如下所示:
def func2(arg1, arg2, *other_args)
# ...
end
假设我们称这种方法为:
func2(1, 2, 3, 4, 5)
如果您现在在func2
范围内判断arg1
、arg2
和other_args
,您将得到以下结果:
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]
将包含散列.
资源:
Update based on OP's comments
如果要将散列作为参数传递,则不应使用splat运算符.Ruby允许在方法调用中省略方括号including those that specify a Hash(注意,请继续阅读).因此:
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