所有文件都是ruby约定是否在具有文件夹结构的模块中(类似于java包)?
例如,如果我的文件结构看起来像
LIB /人/ utils的
这里的文件是否具有模块结构,例如:
module People
module Utils
# some functionality for People::Utils
end
end
我问的原因是因为我一直在阅读一些rails代码,并且似乎有几个文件在这样的文件结构中,但是没有任何模块声明。
我猜这样就可以使用效用函数,而不必包含People::Utils
。
ruby中是否存在关于何时应该使用模块以及何时应该使用模块的约定?
答案 0 :(得分:15)
这是Rails的标准。 Rails加载模型的方法是查看文件夹结构以猜测类的位置。我们有所谓的autoload_paths
。
您可以通过调用rails console
找到它们(这有点笨拙,可能有一种更简单的方式来展示它们):
app.instance_variable_get(:"@app").instance_variable_get(:"@_all_autoload_paths")
config.autoload_paths += %W(#{config.root}/lib)
配置块中没有config/application.rb
的默认Rails应用输出如下所示:
["/Users/lunks/Code/rsvp/app/assets",
"/Users/lunks/Code/rsvp/app/controllers",
"/Users/lunks/Code/rsvp/app/helpers",
"/Users/lunks/Code/rsvp/app/mailers",
"/Users/lunks/Code/rsvp/app/models"]
因此,如果您有app/models/something/util.rb
并且在某处调用Something::Util
,则会查看这些路径,找到app/models/
something/util.rb
文件夹并加载此文件。< / p>
另一方面,Ruby并不关心这一点。纯Ruby中的自动加载按照this page中的描述工作。您必须使用自动加载或直接需要文件(文件夹结构不会有任何意义)。
答案 1 :(得分:4)
将类和文件放在这样的结构中通常是个好主意,因为这样可以让人们更容易将类的名称映射到它的定义。
但是不要这样做是有道理的(最终你可以根据自己的喜好构建代码)。当有很多小班都处理同样的事情时,我偶尔也会这样做,我把它们放在一起。
有一个没有定义模块或类的文件是有意义的,例如配置文件,二进制文件或引导文件(加载所有其他文件的文件)。