Gem 是否应该假设其他 gem 已加载?

Should Gem assumes that other gem is loaded?

我们有一个 gem,其中我们有一个方法 #display_name,如果定义了 I18n gem,此方法 returns 本地化名称,否则回退到 default_display_name.

以下是当前的实现:

  def display_name
    if Module.const_defined?(:I18n)
      localized_display_name
    else
      default_display_name
    end
  end

我们想在我们调用的每个方法调用上重构它 Module#const_defined?

以下是建议的实现。

if Module.const_defined?(:I18n)
  def display_name
    localized_display_name
  end
else
  def display_name
    default_display_name
  end
end

从表面上看,这看起来不错,但我们担心现在我们假设的要求顺序为 gem。所以,我的问题是,gem 是否应该假设另一个 gem 已加载(在本例中为 I18n),或者它应该像当前实现一样延迟检查。

欢迎对 refactoring/optimizations 提出任何其他建议。提前致谢!

来自 ruby documentation

require(name) → true or false Loads the given name, returning true if successful and false if the feature is already loaded.

这意味着如果您 require 没有多次加载 file\gem。因此,我将在您的程序的入口点明确说明要求。

您始终可以使用

测试是否存在 ruby​​gem
Gem.loaded_specs.has_key? 'gem-name'