为什么 ActiveSupport try() 在我用 bang 定义方法 try 时被覆盖

Why ActiveSupport try() is override when I define a method try with a bang

当我定义一个方法将我的 ActiveRecord 用户属性 currency_code 设置为土耳其里拉 (TRY) 时,真是令人惊讶。

所以在User中我定义了:

define_method("try!"){ update! currency_code: :try }.

而且它显然用同一个块定义了 try()try!() User.first.try 的结果正在更新我的用户实例。

我进行了调查,但我不明白 try()(如果它为 nil 则阻止您调用方法引发的主动支持)被覆盖并现在执行更新的位置。

为了确保我为美元定义了相同的

define_method("usd!"){ update! currency_code: :usd } 并且这个方法工作正常。此处未定义 usd() 方法。

我不是在寻找解决方法,而是在寻找对这个魔法的解释:)

谢谢

这是因为 ActiveSupport 的 try 方法在内部也使用了 try!,至少在 Rails 5.1:

# File 'lib/active_support/core_ext/object/try.rb', line 5

def try(*a, &b)
  try!(*a, &b) if a.empty? || respond_to?(a.first)
end