传递一个哈希函数(*参数)及其含义
当使用一个成语如:
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
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的评论进行更新
如果你想传递一个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
- 水豚:未定义的方法'访问'
- 为什么我们将Ruby 1.9.2 / 1.9.3 gem安装到1.9.1文件夹中?
- 如何从Ruby数组创build平均值?
- Elastic Beanstalk Ruby / Rails需要安装git所以捆绑安装工程..但不是
- Rails 4,Capistrano 3.0.0,无法加载这样的文件 – 部署
- rbenv,rvm和chruby有什么区别?
- ActionController :: InvalidAuthenticityToken在RegistrationsController#create中
- Rails的accept_nested_attributes_for与f.fields_for和AJAX
- 为什么“啜食”一个文件不是一个好习惯?