带有可选参数的 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
谁能帮我解决这个问题:
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