在Ruby的其他模块中包含模块意味着什么?

在Ruby的其他模块中包含模块意味着什么?,ruby,Ruby,它本质上是名称空间。您可以通过模块制作::语法::制作完成同样的事情。不管出于什么原因,嵌套它们是大多数著名的gem/项目所做的,出于那个未知的原因,我也这么做。我很想了解为什么人们通常喜欢筑巢而不是更直接的方法。正如你在最后一行中所说的那样。如果在其他模块中定义模块,则该模块将具有名称空间。因此,使用您的代码Make模块将可从外部访问制造模块定义及其名称空间: module Fabrication module Syntax # Extends Fabrication to pr

它本质上是名称空间。您可以通过
模块制作::语法::制作
完成同样的事情。不管出于什么原因,嵌套它们是大多数著名的gem/项目所做的,出于那个未知的原因,我也这么做。我很想了解为什么人们通常喜欢筑巢而不是更直接的方法。

正如你在最后一行中所说的那样。如果在其他
模块
中定义
模块
,则该模块将具有名称空间。因此,使用您的代码
Make
模块将可从外部访问
制造
模块定义及其名称空间:

module Fabrication
  module Syntax

    # Extends Fabrication to provide make/make! class methods, which are
    # shortcuts for Fabricate.build/Fabricate.
    #
    # Usage:
    #
    # require 'fabrication/syntax/make'
    #
    # User.make(:name => 'Johnny')
    #
    #
    module Make
      def make(*args, &block)
        overrides = Fabrication::Support.extract_options!(args)
        klass = name.underscore.to_sym
        fabricator_name = args.first.is_a?(Symbol) ? "#{klass}_#{args.first}" : klass
        Fabricate.build(fabricator_name, overrides, &block)
      end

      def make!(*args, &block)
        overrides = Fabrication::Support.extract_options!(args)
        klass = name.underscore.to_sym
        fabricator_name = args.first.is_a?(Symbol) ? "#{klass}_#{args.first}" : klass
        Fabricate(fabricator_name, overrides, &block)
      end
    end
  end
end

Object.extend Fabrication::Syntax::Make

这允许您在根命名空间中定义模块
Make
,而不存在命名冲突

名称空间。您可以使用
操作符深入嵌套的名称空间

看看这个:

Fabrication::Syntax::Make
正如您所看到的,这允许您以一种保持模块化的方式构造代码。您可以编写一个使用多种不同类和模块的组件,但它们都位于一个名称空间中。从该代码中,您可以轻松访问在其自己的命名空间或父命名空间中声明的任何常量。但其他代码无法看到这些常量,除非您显式地钻取它们


结果是组织良好、结构良好的组件,可以很容易地与其他组件混合,因为它们完全存在于一个名称中,不太可能与项目中的其他代码冲突。

如果您使用
模块a::B::C
引用它们,则前面的模块必须已经存在。在irb:
模块A::B::C
上试用,您将得到一个
未初始化常量A
错误。这就是我们筑巢的原因:-)
module Galaxy
  module StarSystem
    module Planet
    end

    Galaxy     # references Galaxy
    StarSystem # references Galaxy::StarSystem
    Planet     # references Galaxy::StarSystem::Planet

  end
end

Galaxy                     # references the Galaxy module
Galaxy::StarSystem::Planet # References the Planet module declared above.
Planet                     # Exception! No constant Planet exists in this namespace