Require возвращает массив вместо логического - PullRequest
7 голосов
/ 13 июня 2011

Согласно документации для 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 Ответ

2 голосов
/ 13 июня 2011

Я тоже не могу воспроизвести это. Но возможно, что некоторые драгоценные камни переопределяют 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]
...