【问题标题】:Require returns an array instead of a booleanRequire 返回一个数组而不是布尔值
【发布时间】:2011-09-13 18:49:18
【问题描述】:

根据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.8.7 和 1.9.2 上重现它。此外,我查看了源代码(eval.c:7405),该函数似乎无法返回除 true/false 之外的任何内容。
  • 好的,我想我现在明白了。原来我在 IRB 会议的早些时候有 require 'rubygems'require 'active_support'。看起来 Rails 的 ActiveSupport 导致了行为上的差异。在ActiveSupport::Dependencies::Loadable 中有一个require 方法。

标签: ruby require


【解决方案1】:

我也无法复制它。但有可能某些 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

当你尝试要求时

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 的 gem 是 Rails 的 ActiveSupport。
  • +1 是的 Activesupport 做了很多邪恶的事情来覆盖核心方法。希望 Ruby 2 将通过“改进”yehudakatz.com/2010/11/30/ruby-2-0-refinements-in-practice 解决这个问题
猜你喜欢
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 2017-04-22
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多