【发布时间】:2010-09-13 14:17:14
【问题描述】:
当使用成语时,例如:
def func(*args)
# some code
end
*args是什么意思?谷歌搜索这个具体问题非常困难,我找不到任何东西。
似乎所有参数实际上都出现在args[0] 中,所以我发现自己正在编写防御性代码,例如:
my_var = args[0].delete(:var_name) if args[0]
但我确信我错过了更好的方法。
【问题讨论】:
标签: ruby
当使用成语时,例如:
def func(*args)
# some code
end
*args是什么意思?谷歌搜索这个具体问题非常困难,我找不到任何东西。
似乎所有参数实际上都出现在args[0] 中,所以我发现自己正在编写防御性代码,例如:
my_var = args[0].delete(:var_name) if args[0]
但我确信我错过了更好的方法。
【问题讨论】:
标签: ruby
* 是 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] 将包含哈希,正如您所观察到的那样。
资源:
根据 OP 的 cmets 更新
如果您想将 Hash 作为参数传递,则不应使用 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
【讨论】:
if args[0] 技术?
my_func arg1, arg2, :html_arg => value, :html_arg2 => value2)。理想情况下,我希望收到args hash,而不是args 可能包含哈希的数组。