TL;DR: ice_cube
0.16.4 已经整理好了这些与 ruby 3.x 的兼容性问题,所以只需升级即可。
这个问题与ruby 3.0 中如何处理关键字参数如何ice_cube
is 传递其参数 to I18n.localize.
因此,提取并简化有错误的代码,这在 ruby
RUBY_VERSION # "2.7.2"
def foo(*args)
bar(*args)
end
def bar(object, locale: nil, format: nil, **options)
puts "object:#{object}"
puts "locale:#{locale}"
puts "format:#{format}"
puts "options:#{options}"
end
foo('date', format: 'whatever')
# object:date
# locale:
# format:whatever
# options:{}
从红宝石 >= 3
RUBY_VERSION # "3.0.0"
def foo(*args)
bar(*args)
end
def bar(object, locale: nil, format: nil, **options)
puts "object:#{object}"
puts "locale:#{locale}"
puts "format:#{format}"
puts "options:#{options}"
end
foo('date', format: 'whatever')
# Traceback (most recent call last):
# 16: from /Users/alter/.rbenv/versions/3.0.0/lib/ruby/3.0.0/bundler/cli.rb:24:in `start'
# 15: from /Users/alter/.rbenv/versions/3.0.0/lib/ruby/3.0.0/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
# 14: from /Users/alter/.rbenv/versions/3.0.0/lib/ruby/3.0.0/bundler/cli.rb:30:in `dispatch'
# 13: from /Users/alter/.rbenv/versions/3.0.0/lib/ruby/3.0.0/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
# 12: from /Users/alter/.rbenv/versions/3.0.0/lib/ruby/3.0.0/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
# 11: from /Users/alter/.rbenv/versions/3.0.0/lib/ruby/3.0.0/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
# 10: from /Users/alter/.rbenv/versions/3.0.0/lib/ruby/3.0.0/bundler/cli.rb:497:in `exec'
# 9: from /Users/alter/.rbenv/versions/3.0.0/lib/ruby/3.0.0/bundler/cli/exec.rb:28:in `run'
# 8: from /Users/alter/.rbenv/versions/3.0.0/lib/ruby/3.0.0/bundler/cli/exec.rb:63:in `kernel_load'
# 7: from /Users/alter/.rbenv/versions/3.0.0/lib/ruby/3.0.0/bundler/cli/exec.rb:63:in `load'
# 6: from /Users/alter/.rbenv/versions/3.0.0/bin/irb:23:in `<top (required)>'
# 5: from /Users/alter/.rbenv/versions/3.0.0/bin/irb:23:in `load'
# 4: from /Users/alter/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/irb-1.3.0/exe/irb:11:in `<top (required)>'
# 3: from (irb):11:in `<main>'
# 2: from (irb):3:in `foo'
# 1: from (irb):5:in `bar'
# ArgumentError (wrong number of arguments (given 2, expected 1))
因此,我看到的修复方法是将参数显式传递给方法:
def foo2(object, **options)
bar(object, **options)
end
foo2('date', format: 'whatever')
# object:date
# locale:
# format:whatever
# options:{}
或者就涉及的模块:
module IceCube
module I18n
def self.l(object, **options)
backend.l(object, **options)
end
end
end
并发送 PR,使用你自己的 fork、monkey-patch,任何最适合你的东西。
但最重要的是,请准备好在许多其他 gem 中发现这个问题,因为第一个稳定的 ruby 3 版本刚刚发布2天前,所以您可能会遇到其他宝石的此类问题,特别是未维护的宝石。
祝你好运。