带有可选参数的ArgumentError



有人能帮我一下吗?

ruby 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)

我理解它试图匹配可选参数,但为什么呢?不应该"有效载荷"变量接收参数?我试图寻找一个解释,但我似乎找不到任何


我曾经使用internal_proxy变量就像有效负载;

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

但是rubocop警告我;

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

第一个非可选参数的哈希值是否总是算作关键字参数?如果是这样,我怎样才能得到我上面提到的预期行为?(除非是一个坏的做法,因为某些原因)

这是一个bug,还是有一个原因??

In 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},第二次调用将打印空散列{}。您可以尝试上面的代码片段

最新更新