将哈希传递给函数(*args)及其含义

shm*_*ael 70 ruby

使用成语时如:

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,arg2other_argsfunc2现在,你将得到如下结果:

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)