Ruby - 包括两个都具有相同名称的子模块的模块

时间:2014-06-10 16:51:26

标签: ruby oop module

我有两个模块FooBar。每个都有一个名为Errors的命名空间模块,其中包含错误类:

module Foo
  module Errors
    class FooError < StandardError
      def initialize
        super "I'm a FooError"
      end
    end
  end
end

module Bar
  module Errors
    class BarError < StandardError
      def initialize
        super "I'm a BarError"
      end
    end
  end
end

我希望include我的班级中的这两个模块Baz,并且能够访问这两个Errors模块。如此:

class Baz
  include Foo
  include Bar

  p Errors::FooError.new
  p Errors::BarError.new
end

Ruby在尝试实例化uninitialized constant Bar::Errors::FooError时抛出错误FooError,而不是BarError

我是否正确理解Bar::Errors模块正在覆盖Foo:Errors模块?如何防止这种情况发生/完成从Baz内引用这两种类型的错误?

谢谢!

1 个答案:

答案 0 :(得分:4)

您始终可以将模块重命名为不冲突:

Foo::FooErrors = Foo::Errors
Bar::BarErrors = Bar::Errors

或者您可以跳过冲突的模块并直接包含您想要的错误类:

class Baz
  include Foo::Errors
  include Bar::Errors
end

或者不要打扰包含任何内容并使用全名:

p Foo::Errors::FooError.new
p Bar::Errors::BarError.new

在我看来,include经常被用作避免输入模块名称的便捷方法。这种用法并不是必需的,可能会引入错误(如您所见)或含糊不清。有些事情你只能 使用include来完成(比如从模块中添加实例方法),但我看到的大多数用途都不属于那个阵营。