我有一个小猴子补丁来处理一些不需要的 ruby 2.7 警告,当我直接从初始化程序文件执行代码时,它工作得很好,但是当我将代码移动到 lib 目录并从使用包含所有测试的初始化程序开始中断
module Extensions
module BigDecimalFormatWarningSuppressor
# NOTE: this API comes from ActiveSupport::NumericWithFormat, the last ancestor prepended to
# BigDecimal.
def to_s(args)
original_verbosity = $VERBOSE
$VERBOSE = nil
v = super
$VERBOSE = original_verbosity
v
end
end
end
BigDecimal.prepend(Extensions::BigDecimalFormatWarningSuppressor)
因此,为了将所有猴子补丁放在一个地方,我们开始将它们移动到 lib(extensions) 中的目录,并开始使用简单的 include 在初始化程序中调用它们。
include Extensions::BigDecimalFormatWarningSuppressor
问题是:当我直接在初始化程序内部运行此代码时,一切都像魅力一样工作,但是当我按上面的方式运行代码时,许多测试开始中断:
/path/lib/extensions/big_decimal_format_warning_suppressor.rb:14:in `to_s'
/path/lib/extensions/big_decimal_format_warning_suppressor.rb:14:in `to_s': wrong number of arguments (given 2, expected 0) (ArgumentError)
疯狂的猜测,但我认为这是因为你正在使用prepend。当您预先添加内容时,它会更早加载到堆栈中,并且可以稍后被覆盖,因此在您的情况下最好避免它。
尝试使用 extend 或 include 来代替。