提问人:Risha 提问时间:3/2/2023 最后编辑:DeepeshRisha 更新时间:10/30/2023 访问量:1927
Ruby 3.0 - 参数数量错误(给定 3 个,预期为 1..2)
Ruby 3.0 - wrong number of arguments (given 3, expected 1..2)
问:
我们有一个使用 uk_postcode gem 的项目。有一个验证器类,如下所示:
class UkPostcodeValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
postcode = UKPostcode.parse(value.to_s)
return if postcode.full_valid?
record.errors.add attribute, :invalid_uk_postcode, options
end
end
以上内容在 Ruby 2.7.6 中工作正常,但现在我需要更新到 Ruby 3.0.0。当我这样做时,我们的测试会中断并给出以下错误:
Failure/Error: record.errors.add attribute, :invalid_uk_postcode, options
ArgumentError:
wrong number of arguments (given 3, expected 1..2)
我对 Ruby 和 Rails 的了解还不是很好,但在网上搜索了这么多并尝试了不同的东西之后,我发现改变以修复测试。因此,在最后一个参数中添加 ** 可以修复测试,并且似乎验证可以正常工作。从我目前所读到的内容来看,参数似乎必须更加具体,并且通过添加 ** 使其成为关键字参数(我假设它可以采用任何类型/值),但由于我还不是 Ruby 和 Rails 的专家,这更像是一种猜测,而不是正确理解这一点。record.errors.add attribute, :invalid_uk_postcode, options
record.errors.add attribute, :invalid_uk_postcode, **options
有人可以更好地指导吗?以这种方式修复上述更改似乎可以吗?为什么在最后一个参数中添加 ** 可以解决错误问题?
我不确定 atm,指的是什么选项以及我将在未来研究的内容,但任何知道并能回答的人将不胜感激。谢谢
在线搜索错误,可以看到 Ruby 语法有更改。试图理解这一点。
答:
10赞
Deepesh
3/3/2023
#1
关键字参数现在与位置参数完全分离
def new_style(name, **options)
end
new_style('John', {age: 10})
# Ruby 2.6: works
# Ruby 2.7: warns: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
# Ruby 3.0: ArgumentError (wrong number of arguments (given 2, expected 1))
new_style('John', age: 10)
# => works
h = {age: 10}
new_style('John', **h)
# => works, ** is mandatory
方法的定义是:add
def add(attribute, type = :invalid, **options)
因此,现在不支持在没有的情况下传递哈希值。相反,你可以直接将它们作为关键字参数传递,如下所示:options
**
**
record.errors.add attribute, :invalid_uk_postcode, count: 25, other_attr: 'any text'
评论
0赞
max
3/3/2023
这里的方法有点无关紧要。使用哈希作为定位参数的方法不会受到 Ruby 3 中更改的影响。old_style
评论
options