Rails ::module_name vs module_name 和模块在几个文件之间拆分

Posted

技术标签:

【中文标题】Rails ::module_name vs module_name 和模块在几个文件之间拆分【英文标题】:Rails ::module_name vs module_name and modules being splitted between several files 【发布时间】:2019-10-18 13:16:58 【问题描述】:

假设我在 app/lib 中有一个解析器模块 (parser.rb):

module Parsers
    class XMLParser
        def self.parse
            "Parsing XML...."
        end
    end

    class TXTParser
        def self.parse
            "Parsing TXT...."
        end
    end
end

我见过一些人这样称呼类:

@parse_xml = ::Parsers::XMLParser.parse
@parse_txt = ::Parsers::TXTParser.parse

代替:

@parse_xml = Parsers::XMLParser.parse
@parse_txt = Parsers::TXTParser.parse

两种方式都有效,那么有什么区别?此外,我还看到了将模块拆分为多个文件的情况,例如:

内部app/lib/parsers/xml_parser.rb

module Parsers
    class XMLParser
        def self.parse
            "Parsing XML...."
        end
    end
end

app/lib/parsers/txt_parser.rb里面:

module Parsers
    class TXTParser
        def self.parse
            "Parsing XML...."
        end
    end
end

这两个选项之间是否有任何区别(除了明显的...较小的文件)?

【问题讨论】:

【参考方案1】:

这两种方式都有效,那么有什么区别呢?此外,我还看到了将模块拆分为多个文件的情况,例如:

:: 允许您定位根级别范围。默认情况下,ruby 会搜索您所在的当前作用域树。我知道这听起来很模糊,但是一个示例可以说明这一点:

module A
  module B
    def self.test
      A::C.test
      D::B.test
      ::D::B.test
    end
  end

  module C
    def self.test
      p "calling A::C"
    end
  end

  module D
    module B
      def self.test
        p "calling A::D::B"
      end
    end
  end
end

module D
  module B
    def self.test
      p "calling D::B"
    end
  end
end

A::B::test

这将打印:

"calling A::C"
"calling A::D::B"
"calling D::B"

这两个选项之间是否有任何区别(除了明显的...较小的文件)?

这两种方法都一样。通常,在 ruby​​ 中,您为每个文件执行一个类定义,文件以该类命名。所以你会更经常看到两个文件的版本,我会推荐它的风格,但没关系。

【讨论】:

以上是关于Rails ::module_name vs module_name 和模块在几个文件之间拆分的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails Mountable vs. Full Engine

from module_name import * 与 import module_name 的区别

在AWS上使用Capistrano的Rails secrets.yml VS Dotenv VS Figaro

Choosing web framework: ASP.NET MVC vs Django Python vs Ruby on Rails(转载)

在 Rails 4 中用于 JSON 处理的 jbuilder vs rails-api/active_model_serializers

Rails content_tag vs tag