所有ruby文件都应该具有与文件夹结构匹配的模块结构吗?

时间:2012-07-18 04:43:54

标签: ruby module idioms

所有文件都是ruby约定是否在具有文件夹结构的模块中(类似于java包)?

例如,如果我的文件结构看起来像

LIB /人/ utils的

这里的文件是否具有模块结构,例如:

module People
  module Utils
    # some functionality for People::Utils
  end
end      

我问的原因是因为我一直在阅读一些rails代码,并且似乎有几个文件在这样的文件结构中,但是没有任何模块声明。

我猜这样就可以使用效用函数,而不必包含People::Utils

ruby​​中是否存在关于何时应该使用模块以及何时应该使用模块的约定?

2 个答案:

答案 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)

将类和文件放在这样的结构中通常是个好主意,因为这样可以让人们更容易将类的名称映射到它的定义。

但是不要这样做是有道理的(最终你可以根据自己的喜好构建代码)。当有很多小班都处理同样的事情时,我偶尔也会这样做,我把它们放在一起。

有一个没有定义模块或类的文件是有意义的,例如配置文件,二进制文件或引导文件(加载所有其他文件的文件)。