要求返回数组而不是布尔值

时间:2011-06-13 09:07:56

标签: ruby require

根据Kernel#require的文档,该方法返回一个布尔值。我注意到在IRB会话中,对于某些文件require会返回一个数组。

ruby-1.8.7-p330 :001 > require 'net/http'
=> true 
ruby-1.8.7-p330 :002 > require 'date'
=> true 
ruby-1.8.7-p330 :003 > require 'lib/data_provider'
=> ["DataProviders"] 

返回的数组包含data_provider.rb中定义的模块的名称:

module DataProviders
  module Cached
    class Foo
    # ...
    end
  end

  class Foo
  # ...
  end
end

这是我做错事的标志还是require的一些无证行为?

1 个答案:

答案 0 :(得分:2)

我也无法重现它。但有些宝石可能会覆盖Kernel#require

module Kernel
  alias_method :old_require, :require
  def require(str)
    old_modules = []
    ObjectSpace.each_object(Module) {|m| old_modules << m }

    old_require(str)

    new_modules = []
    ObjectSpace.each_object(Module) {|m| new_modules << m unless old_modules.include?(m) }
    new_modules
  end
end

当你尝试要求时

module DataProviders
  module Cached
    class Foo
    end
  end
  class Foo
  end
end

你会得到

irb(main):012:0> require 'data_provider'
=> [DataProviders::Cached::Foo, DataProviders::Foo, DataProviders::Cached, DataProviders]