传递一个哈希函数(*参数)及其含义

当使用一个成语如:

def func(*args) ... end 

* args的含义是什么? 谷歌search这个具体的问题是非常困难的,我什么都找不到。

看来所有的参数实际上都出现在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 arg1arg2other_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的评论进行更新

如果你想传递一个Hash作为参数,你不应该使用splat操作符。 Ruby允许你在你的方法调用中省略括号, 包括那些指定一个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 
 def func(map={}) x = map.delete(:y) end