根据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"]
Run Code Online (Sandbox Code Playgroud)
返回的数组包含data_provider.rb中定义的模块的名称:
module DataProviders
module Cached
class Foo
# ...
end
end
class Foo
# ...
end
end
Run Code Online (Sandbox Code Playgroud)
这是我做错事或一些无证行为的标志require吗?
我也无法重现。但有些 gem 可能会覆盖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
Run Code Online (Sandbox Code Playgroud)
当你试图要求
module DataProviders
module Cached
class Foo
end
end
class Foo
end
end
Run Code Online (Sandbox Code Playgroud)
你会得到
irb(main):012:0> require 'data_provider'
=> [DataProviders::Cached::Foo, DataProviders::Foo, DataProviders::Cached, DataProviders]
Run Code Online (Sandbox Code Playgroud)