Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby-包括两个模块,这两个模块都有一个同名的子模块_Ruby_Oop_Module - Fatal编程技术网

Ruby-包括两个模块,这两个模块都有一个同名的子模块

Ruby-包括两个模块,这两个模块都有一个同名的子模块,ruby,oop,module,Ruby,Oop,Module,我有两个模块,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 < Stand

我有两个模块,
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
Ruby在尝试实例化
FooError
时抛出一个错误
未初始化的常量条::Errors::FooError
,但不是针对
BarError

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


谢谢

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

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
(比如从模块中添加实例方法)来完成,但我看到的大多数用法并不属于这一类。

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

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
(比如从模块中添加实例方法)来完成,但我看到的大多数用法都不属于这一类。

在任何给定的时间,您只能使用一个名称空间。为什么你故意在两件冲突的事情上调用
include
?最好避免这种情况,只使用它们的长而正式的名称来引用它们。我猜
Foo
Bar
通常会包含更多的内容,而不仅仅是冲突的模块。如果你真的需要这样设置,你需要更明确地调用它们。比如:
p Foo::Errors::BarError.new
感谢您的回复。为了添加一些上下文,
Foo
Bar
都是处理使用两种不同API的问题。类
Baz
是一个可以使用这两种API的实体。看起来就像@Max answer关于将它们重命名为
foorerrors
BarErrors
的方法一样。在任何给定时间,您只有一个名称空间可以使用。为什么你故意在两件冲突的事情上调用
include
?最好避免这种情况,只使用它们的长而正式的名称来引用它们。我猜
Foo
Bar
通常会包含更多的内容,而不仅仅是冲突的模块。如果你真的需要这样设置,你需要更明确地调用它们。比如:
p Foo::Errors::BarError.new
感谢您的回复。为了添加一些上下文,
Foo
Bar
都是处理使用两种不同API的问题。类
Baz
是一个可以使用这两种API的实体。看起来像@Max-answer关于将它们重命名为
foorerrors
BarErrors
的方法。感谢@Max。我使用include将
Foo
Bar
中定义的方法提供给
Baz
(然后提供给其他类似于
Baz
)的“实体”。正如您在第一个示例中所示,重命名它们似乎是最简单的解决方法。这当然是一种方法,但在另一个名称空间中定义常量却有点尴尬。如果你养成这种习惯,这种相互依赖会造成很大的破坏。您的第二种和第三种方法要好得多。感谢@Max。我使用include将
Foo
Bar
中定义的方法提供给
Baz
(然后提供给与
Baz
类似的许多其他“实体”)。正如您在第一个示例中所示,重命名它们似乎是最简单的解决方法。这当然是一种方法,但在另一个名称空间中定义常量却有点尴尬。如果你养成这种习惯,这种相互依赖会造成很大的破坏。你的第二和第三种方法要好得多。