Rails :: module_name与module_name以及模块被分割成几个文件

时间:2019-06-02 23:12:47

标签: ruby-on-rails ruby module

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

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 个答案:

答案 0 :(得分: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中,您对每个文件进行一个类定义,并以该类命名。因此,您会更经常看到两个文件的版本,我建议将其用作样式,但这并不重要。