【问题标题】:Collecting keyword arguments in Ruby在 Ruby 中收集关键字参数
【发布时间】:2018-08-06 00:47:59
【问题描述】:

只是想了解如何在 Ruby 中收集参数,我想出了以下 sn-p,在某些情况下似乎无法在 **kargs 中收集 keyword arguments

def foo(i, j= 9, *args, k: 11, **kargs)
  puts "args: #{args}; kargs: #{kargs}"
end

foo(a: 7, b: 8)
# output: args: []; kargs: {}
foo(9, a: 7, b: 8)
# output: args: []; kargs: {:a=>7, :b=>8}
foo(9, 10, 13, a: 7, b: 8)
# output: args: [13]; kargs: {:a=>7, :b=>8}

我想知道为什么它在第一次调用foo 时没有收集到kargs,而在第二次调用时却收集到了。

【问题讨论】:

    标签: ruby keyword-argument


    【解决方案1】:

    这是因为第一个参数i 是必需参数(没有默认值),所以,传递给方法的第一个值(在您的第一个示例中,这是散列{a: 7, b: 8})存储在其中。

    然后,由于其他所有内容都是可选的,剩余的值(如果有,在此示例中没有)将根据需要填写。 IE,第二个参数会转到j,除非是命名参数,否则会转到kargs(或k)。第三个参数,以及任何剩余的——直到第一个关键字参数,进入args,然后任何关键字参数进入kargs

    def foo(i, j= 9, *args, k: 11, **kargs)
      puts "i: #{i}; args: #{args}; kargs: #{kargs}"
    end
    
    foo(a: 7, b: 8)
    # i: {:a=>7, :b=>8}; args: []; kargs: {}
    

    【讨论】:

    • 谢谢,我去看看。我认为只有当我通过foo({a: 7, b: 8}) 打电话时才会发生这种情况。也许这是 Ruby 在调用时避免错误的方法?
    • 有没有办法避免这种情况发生?我正在尝试构建一个包含*args**kw_argscurry 函数。请参阅this answer
    • 我还没有测试过它,但从我在Ruby 3 中读到的内容来看,它应该无法运行foo(a: 7, b: 8)。对吗?
    猜你喜欢
    • 1970-01-01
    • 2020-03-25
    • 2011-01-28
    • 2016-12-01
    • 1970-01-01
    • 2017-08-08
    • 2014-01-09
    • 2015-09-05
    • 2016-01-15
    相关资源
    最近更新 更多