【问题标题】:How to know if I have required a library如何知道我是否需要图书馆
【发布时间】:2014-02-21 02:05:01
【问题描述】:

有没有办法做类似这个伪代码的事情?

puts was_required?('my-library')
=> false

require('my-library')
puts was_required?('my-library')
=> true

我希望能够通过 require-name 来测试我是否需要某个库,无论是 Gem o 还是 Rake 任务。

如果 gem 加载的类可用,我可以测试 gem 测试,但我真的很想使用库名进行测试,而不是类名。

对于 rake 任务也是如此。如果有我需要的库中的任务,我可以在Rake.tasks 中找到,我想用库名称进行测试,没有任务名称

谢谢

【问题讨论】:

    标签: ruby gem rake


    【解决方案1】:

    也许您想玩弄$LOADED_FEATURES$" 的别名),该数组包含由require 加载的module names

    def was_required?(file)
      rex = Regexp.new("/#{Regexp.quote(file)}\.(so|o|sl|rb)?")
      $LOADED_FEATURES.find { |f| f =~ rex }
    end
    
    was_required?('uri')
    #=> false
    require 'uri'
    #=> true
    was_required?('uri')
    #=> true
    

    顺便说一句,这正是 Ruby 在 require 方法中所做的。

    【讨论】:

    • 谢谢! $LOADED_FEATURES 正是我所需要的。我对您提出的 reexeg 有疑问。它找不到所需的文件,如果我删除正则表达式开头的“lc”,它工作正常。有什么想法吗?
    • 我从IRB::Locale的源代码中复制了这个正则表达式。因此,lc 似乎特定于它工作的 IRB 控制台。我更新了我的答案并删除了该部分以使其在 IRB 控制台之外工作。
    猜你喜欢
    • 2017-11-30
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2012-06-14
    • 2018-07-23
    • 2022-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多