需要返回一个数组而不是布尔值

7
根据文档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的一些未记录行为?

2
我无法在1.8.7或1.9.2上重现它。此外,我查看了源代码(eval.c:7405),该函数似乎只能返回true/false,无法返回其他内容。 - Evgeny Shadchnev
2
好的,我想我现在明白了。原来我在那个IRB会话中先使用了require 'rubygems'require 'active_support'。看起来Rails的ActiveSupport导致了行为上的差异。在ActiveSupport :: Dependencies :: Loadable中有一个require方法。 - FilipK
1个回答

2
我也无法重现它。但是有可能某个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

当您尝试使用require时

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]

是的,你说得对 - 请看我的问题评论。覆盖“require”的宝石是Rails的ActiveSupport。 - FilipK
+1 是的,Activesupport 会覆盖核心方法并进行很多有害的操作。希望 Ruby 2 能够通过“refinements”来解决这个问题。http://yehudakatz.com/2010/11/30/ruby-2-0-refinements-in-practice/ - Michael Papile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接