【问题标题】:ArgumentError with optional parameters带有可选参数的 ArgumentError
【发布时间】:2021-10-18 19:20:46
【问题描述】:

谁能帮我解决这个问题:

红宝石 2.7.3p183

情况如下,这个方法:

def send_request(url, payload = {}, internal_proxy: true)

...

还有这个电话

send_request('random_address', { foo: :bar })

返回我:

Traceback (most recent call last):
        5: from C:/Ruby27-x64/bin/irb.cmd:31:in `<main>'
        4: from C:/Ruby27-x64/bin/irb.cmd:31:in `load'
        3: from C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/irb-1.2.6/exe/irb:11:in `<top (required)>'
        2: from (irb):4
        1: from (irb):1:in `send_request'
ArgumentError (unknown keyword: :foo)

我知道它正在尝试匹配可选参数,但为什么呢? 'payload' 变量不应该接收参数吗?我试图搜索解释,但我似乎找不到任何解释


我曾经使用 internal_proxy 变量,就像有效载荷一样;

def send_request(url, payload = {}, internal_proxy = true)

但是 rubocop 会警告我;

Use keyword arguments when defining method with boolean argument.
(convention:Style/OptionalBooleanParameter)

第一个非可选参数的散列是否总是算作关键字参数?如果是这样,我怎样才能得到我上面提到的预期行为? (除非出于某种原因是一种不好的做法)

这是一个错误,还是有原因??

【问题讨论】:

    标签: ruby rubocop


    【解决方案1】:

    您的问题的一个可能解决方案是更改参数的顺序如下:

    def send_request(url, internal_proxy: true, **payload)
        p payload
        p 'fooo'
    end
    
    send_request('asd', {foo: :bar})
    send_request('asd')
    
    

    上面的代码应该执行您正在寻找的行为。此外,引入双 splat (**) 将所有额外命名的关键字收集为哈希参数。第一次调用将打印哈希{foo: :bar},第二次调用将打印一个空哈希{} 你可以试试上面的sn-p here

    【讨论】:

      【解决方案2】:

      在 Ruby

      Ruby 3.0 修复了这个问题。

      如果可以的话,您应该升级到 Ruby 3.0,或者考虑使用不同的 API。

      【讨论】:

        猜你喜欢
        • 2021-02-28
        • 2021-06-24
        • 2016-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-16
        • 2017-03-28
        相关资源
        最近更新 更多