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