gpt4 book ai didi

ruby - 处理带有可选参数后跟关键字参数列表的方法

转载 作者:数据小太阳 更新时间:2023-10-29 07:16:37 26 4
gpt4 key购买 nike

我想将一个可选参数(任何数据类型,甚至是哈希)后跟关键字参数列表(可以为空)传递给一个方法。

这是我得到的:

def my_method(subject = nil, **options)
[subject, options]
end

在以下情况下,方法输出符合预期:

  • 没有

    my_method()
    # => [nil, {}]
  • 主题

    my_method('foo')
    # => ["foo", {}]
  • 带有选项的文字主题

    my_method('foo', bar: 'bar')
    # => ["foo", {:bar=>"bar"}]
  • 一个Hash作为带有选项的主题

    my_method({foo: 'foo'}, bar: 'bar')
    # => [{:foo=>"foo"}, {:bar=>"bar"}]
  • 没有主题,只有选项

    my_method(bar: 'bar')
    # => [nil, {:bar=>"bar"}]

当传递一个 Hash 作为主题并且没有选项时,期望的结果是:

my_method({foo: 'foo'})
# => [{:foo=>"foo"}, {}]

但我得到以下信息;我没有得到正确的主题:

my_method({foo: 'foo'})
# => [nil, {:foo=>"foo"}]

my_method(foo: 'foo') 是否等同于 my_method({foo: 'foo'})?关于如何获得预期结果的任何想法?

最佳答案

看,你有 **options 作为没有任何默认值的参数,第一个参数有默认值。所以理解下面的单参数情况

每当传递单个参数时,都会尝试将其分配给第二个参数(因为第一个参数默认为 nil)& 如果由于类型不匹配而失败,则将其分配给第一个参数。这就是 my_method(4) 的工作原理。

现在假设你有一个参数作为散列传递,它匹配分配给第二个参数然后它当然被分配给第二个参数并且第一个设置为默认值 nil。

如果你想让它工作,那么你可以执行以下操作,

> my_method({sd: 4}, {})
=> [{:sd=>4}, {}]

或者您可以在传递时提供参数名称,

> my_method(subject: {sd: 4})
=> [{:sd=>4}, {}]

关于ruby - 处理带有可选参数后跟关键字参数列表的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54130052/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com