带有可选参数的 ArgumentError

ArgumentError with optional parameters

谁能帮我解决这个问题:

ruby 2.7.3p183

情况是这样的,这个方法:

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

...

和这个电话

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

Returns我:

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 < 3.0 中,如果最后一个参数是散列,并且被调用的方法接受关键字参数,那么它总是被转换为关键字参数。

Ruby 3.0 修复了这个问题。

如果可以,你应该升级到 Ruby 3.0,否则请考虑其他 API。

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

def send_request(url, internal_proxy: true, **payload)
    p payload
    p 'fooo'
end

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

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