Ruby 2.7 特定警告未显示

Ruby 2.7 specific warning not showing

我们想将我们的代码库更新到 Ruby3,其中最大的突破性变化之一是关键字参数与方法中参数的混合。这个警告应该出现

warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call

但我注意到当 运行 一个简单的脚本时,它就不会出现

# script.rb
def my_method(argument, other:)
  puts "hello"
end

options = { other: "medium" }
argument = true

my_method(argument, options)

$ rvm use 2.7.5
$ ruby script.rb
hello

$ rvm use 3.0.1
$ ruby script.rb
script.rb:1:in `my_method': wrong number of arguments (given 2, expected 1; required keyword: other) (ArgumentError)
    from script.rb:8:in `<main>'

它在 Ruby 3 中按计划中断,但在以前的版本中没有显示任何内容。

这种行为在我们的生产中是相同的,我无法在任何地方发现一次。我已经使用 RUBYOPT='-W:deprecated' 甚至 $VERBOSE = true 成功列出了除此之外的其他几个弃用警告。

看了一圈,其他人好像没有这个问题。我在这里缺少什么吗? Ruby里面有选项吗?使用其他版本的 Ruby,如 2.7.2 呈现相同。

另一个细节,我们在 Rails 吨 运行 一切上使用 Ruby,但我相信问题出在 Ruby 本身。

我发现了一些东西。首先,Ruby 2.7.2 及更高版本默认不显示警告,这可以解释我测试中的行为差异。要激活它们,您必须使用 RUBYOPT

# Ruby 2.7.5
$ RUBYOPT='-W:deprecated' ruby script.rb
script.rb:8: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
script.rb:1: warning: The called method `my_method' is defined here
hello

另一点是,您稍后可以设置的$VERBOSE = true 也无法显示此警告。我不确定具体原因,但只有 RUBYOPT 可以解决这个特定问题。

最后,我在本地启动我的 Rails 服务器时也错误地使用了 RUBYOPT 选项,因此没有看到它工作。

希望对您有所帮助。