使用绝对路径自动加载 Ruby



出于某种原因,在我正在处理的一个项目中,有人创建了一个像这样自动加载的 gem:

  [
    [:Utils, 'utils.rb'],
    [:VERSION, 'version.rb'],
    [:SomeOtherClass, 'some_other_class.rb'],
  ].each do |sym, fn|
    autoload sym, File.join(MyGem.gem_root, 'lib/my_gem', fn)
  end

其中MyGem.gem_root给出了 gem 位置的绝对路径,例如/path/to/my_gem。我很好奇为什么这可能比我们依赖正确设置的 gem 加载路径之类的事情更好(或更糟):

 [
    [:Utils, 'utils'],
    [:VERSION, 'version'],
    [:SomeOtherClass, 'some_other_class'],
  ].each do |sym, fn|
    autoload sym, File.join(my_gem, fn)
  end

就个人而言,我觉得看到这一点更令人愉快(尽管代码重复)。

  autoload :Utils, 'my_gem/utils'
  autoload :VERSION, 'my_gem/version'
  autoload :SomeOtherClass, 'my_gem/some_other_class'

无论如何,如果有的话,哪种方式更好?

与 shell 脚本非常相似,最后两个代码块使您受到 PATH 环境变量中任何反复无常的值的影响。因此,它可能会也可能不会加载正确的文件...

例如,想象一个供应商的 gem 和 PATH,Ruby 在尝试供应商的 gem 之前尝试从系统 gem 加载文件。

最新更新