【问题标题】:Passing a hash to a function ( *args ) and its meaning将哈希传递给函数 ( *args ) 及其含义
【发布时间】: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


    【解决方案1】:

    *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 的 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] 技术?
    • @shmichael 你怎么称呼你的方法?如果您不希望将参数放入这样的数组中,请不要使用 splat。
    • 我使用的是 Rails 约定(例如my_func arg1, arg2, :html_arg => value, :html_arg2 => value2)。理想情况下,我希望收到args hash,而不是args 可能包含哈希的数组
    猜你喜欢
    • 1970-01-01
    • 2020-08-23
    • 2017-07-22
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多