更新到 Ruby 3.0 后出现 ArgumentError(参数数量错误(给定 2 个,预期 1))

2023-11-24

当我尝试将网站更新到 Ruby 3.0.0 时,出现以下错误:

ArgumentError(参数数量错误(给定 2 个,预期 1))

 % rails console
Loading development environment (Rails 6.1.0)
irb(main):001:0> puts RUBY_VERSION
3.0.0
irb(main):002:0> puts IceCube::VERSION
0.16.3
irb(main):003:0> schedule = IceCube::Schedule.new
=> #<IceCube::Schedule:0x00007fccfe19cfa8 @start_time=2020-12-27 11:14:30 -0800, @all_recurrence_rules=[], @all_exception_rules=[]>
irb(main):004:0> puts schedule.to_ical
Traceback (most recent call last):
        1: from (irb):4:in `<main>'
ArgumentError (wrong number of arguments (given 2, expected 1))

以下是在 Ruby 2.7.2 中可以使用的相同命令

% rails console
Loading development environment (Rails 6.1.0)
irb(main):001:0> puts RUBY_VERSION
2.7.2
irb(main):002:0> puts IceCube::VERSION
0.16.3
irb(main):003:0> schedule = IceCube::Schedule.new
=> #<IceCube::Schedule:0x00007f9da3128fe8 @start_time=2020-12-27 11:12:50 -0800, @all_recurrence_rules=[], @all_exception_rules=[]>
irb(main):004:0> puts schedule.to_ical
DTSTART;TZID=PST:20201227T111250

令人困惑的是,它也可以与普通的 ruby​​ 脚本一起使用相同的宝石版本作为第一个例子

% irb
irb(main):001:0> puts RUBY_VERSION
3.0.0
irb(main):002:0> gem 'ice_cube'
irb(main):003:0> require 'ice_cube'
irb(main):004:0> puts IceCube::VERSION
0.16.3
irb(main):005:0> schedule = IceCube::Schedule.new
=> #<IceCube::Schedule:0x00007ff2fb0d5b88 @start_time=2020-12-27 11:11:02 -0800, @all_recurrence_rules=[], @all_exception_rules=[]>
irb(main):006:0> puts schedule.to_ical
DTSTART;TZID=PST:20201227T111102

有谁知道我可以从哪里开始解决这个问题?我们刚刚开始这个项目,我希望使用 Ruby 3


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天前,所以您可能会遇到其他宝石的此类问题,特别是未维护的宝石。 祝你好运。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更新到 Ruby 3.0 后出现 ArgumentError(参数数量错误(给定 2 个,预期 1)) 的相关文章

随机推荐

  • 在 MySQL 中使用/存储加密密钥的最佳方法是什么

    我计划使用 MySQL 及其内置加密功能来加密 解密某些表中的某些列 我担心的是我需要将密钥存储在某个地方 我当然可以将密钥存储在文件中并控制该文件的权限以及访问它的应用程序的权限 但这足够了吗 我还可以创建一个网络服务来获取密钥或其他东西
  • 进程间通信选项

    我需要在一个应用程序内订阅另一个应用程序公开的事件 我注意到许多人认为使用 WCF 命名管道是最佳实践 如果我选择 WCF 命名管道 我就必须使用 IIS 对吗 顺便问一下 我一般有哪些选择 命名管道是在同一台机器上进行 IPC 进程间通信
  • 如何使用泛型参数为任何方法构建表达式调用

    我只是尝试使用 Linq Expression 制作如下相同的表达式 Expression
  • ckfinder 调整图像大小

    使用 ckfinder 选择或上传图像后 用户可以更改宽度和高度 我希望它自动将图像大小调整为用户设置的宽度和高度 那可能吗 我认为 ajax 图像调整器可以解决这个问题 但无法让它工作 有人有自动宽度和高度调整大小插件的经验吗 在我的 c
  • 将大量 csv 文件导入 PostgreSQL 数据库的有效方法

    我看到很多将 CSV 导入 PostgreSQL 数据库的示例 但我需要的是一种将 500 000 个 CSV 导入单个 PostgreSQL 数据库的有效方法 每个 CSV 略多于 500KB 总计约 272GB 数据 CSV 的格式相同
  • 异步加载图像到 UICollectionView?

    我如何将图像加载到UICollectionview异步 下面的方法里面 PSTCollectionViewCell collectionView PSTCollectionView collectionView cellForItemAtI
  • Graphite Graph - 我们更新图表的速度有多快?

    我们正在尝试将 Graphite 用于 近 实时图形网络系统 然而 我们似乎无法使石墨的更新速度超过 1 秒 最终我们希望有 100 毫秒的更新 通过阅读常见问题解答 听起来石墨速度很快 但这要么非常具有误导性 要么我不明白如何加速石墨 耳
  • 高效找到最后一个 1 序列中的第一个

    我有以下带有 0 和 1 的向量 test1 lt c rep 0 20 rep 1 5 rep 0 10 rep 1 15 test1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
  • 从 Spark RDD 中删除空分区

    我正在从 HDFS 获取数据并将其存储在 Spark RDD 中 Spark根据HDFS块的数量创建分区的数量 这会导致大量空分区 这些空分区也会在管道传输过程中得到处理 为了消除这种开销 我想从 RDD 中过滤掉所有空分区 我知道合并和重
  • 如何确定 Linux gcc 下 vswprintf 的缓冲区大小

    我需要为格式函数 vswprintf 分配足够的缓冲区 当使用 ANSI 字符串做同样的事情时 我使用 vsnprintf NULL NULL pszFormat args 它返回我所需的缓冲区大小 但这个函数的unicode版本似乎没有这
  • javafx 异常:控制器值已指定

    我正在调用一个方法来通过将一些参数传递给该窗口的特定内部方法来加载窗口 但我遇到了以下异常 GRAVE null javafx fxml LoadException Controller value already specified un
  • 在 Java 中用于读取文件的最好/最简单的类是什么?

    我对简单的线条处理感兴趣 Scanner for Scanner sc new Scanner new File my file sc hasNext String line sc nextLine do something with li
  • 如何检测VideoView是否正在播放视频或正在缓冲?

    如何检测VideoView是否正在播放视频或正在缓冲 我想显示一个弹出窗口 显示视频正在缓冲 在 android API level 17 中有一个回调setOnInfoListener它可以为我提供此信息 但我使用的是 API 级别 15
  • Windows 中 lstat() 的替代品是什么?

    在Linux下 当stat 与损坏的链接文件一起使用 它会失败 1 所以我用了lstat 成功了 对于 Windows 中的相同情况 stat 由于快捷方式损坏而失败 但没有 lstat 在窗户中 请帮忙寻找替代方案lstat 在窗户中 接
  • Xamarin.Forms 是否支持定期后台任务?

    我很难找到有关 Xamarin Forms 后台任务支持的文档 Xamarin Forms 是否提供对定期后台任务的支持 我需要为 Windows Phone 10 和 Android 实现此功能 XF 没有后台任务的实现 您需要在本地实现
  • 分配给 nowPlayingInfo 后,MPNowPlayingInfoCenter 不会更新任何信息

    我正在使用 Swift 3 制作一个 iOS 应用程序 其中在锁定屏幕和控制中心上显示有关当前播放项目的信息会很好 目前 我正在使用以下代码尝试将此信息插入到nowPlayingInfo字典 我还引用了VideoInfo使用的类videoB
  • python:无法连接“str”和“tuple”对象(它应该可以工作!)

    我有一个代码 print bug data str find data 2 1 temp data str find data 2 1 time sleep 1 print bug tuple tuple temp split 之后我的应用
  • C++ 如何正确复制指针的容器(向量)?

    有几次我偶然发现了这样的情况 我有一个需要复制的指针容器 假设我们有以下类层次结构 学生 基班 新生 小班 二年级 小班 初级 小班 高级 小类 学生服务 StudentService 类有一个std vector
  • 以编程方式调用表情符号键盘?

    可以通过编程方式触发表情符号键盘吗 我试图在用户单击按钮时打开表情符号键盘 这可能吗 不幸的是 这在 iOS 中还无法完成 Apple 不提供任何公共 API 来以编程方式切换到另一种输入法 这是用户必须改变的
  • 更新到 Ruby 3.0 后出现 ArgumentError(参数数量错误(给定 2 个,预期 1))

    当我尝试将网站更新到 Ruby 3 0 0 时 出现以下错误 ArgumentError 参数数量错误 给定 2 个 预期 1 rails console Loading development environment Rails 6 1