我有两个模块Foo
和Bar
。每个都有一个名为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
内引用这两种类型的错误?
谢谢!
答案 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
来完成(比如从模块中添加实例方法),但我看到的大多数用途都不属于那个阵营。