【问题标题】:Rails ::module_name vs module_name and modules being splitted between several filesRails ::module_name vs module_name 和模块在几个文件之间拆分
【发布时间】: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

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

【问题讨论】:

    标签: ruby-on-rails ruby module


    【解决方案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​​ 中,您为每个文件执行一个类定义,文件以该类命名。所以你会更经常看到两个文件的版本,我会推荐它的风格,但没关系。

    【讨论】:

      猜你喜欢
      • 2014-03-22
      • 2012-03-31
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2015-06-28
      相关资源
      最近更新 更多