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

Jef*_*rey 9 ruby idioms module

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

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

LIB /人/ utils的

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

module People
  module Utils
    # some functionality for People::Utils
  end
end      
Run Code Online (Sandbox Code Playgroud)

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

我猜这将是如此,你可以使用实用功能,而不必包括People::Utils.

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

Ped*_*nto 15

它是Rails的标准.Rails加载模型的方法是查看文件夹结构以猜测类的位置.我们有所谓的autoload_paths.

您可以通过调用来找到它们rails console(这有点hacky,可能有一种更简单的方式来显示它们):

app.instance_variable_get(:"@app").instance_variable_get(:"@_all_autoload_paths")
Run Code Online (Sandbox Code Playgroud)

默认的Rails应用程序输出,不在config.autoload_paths += %W(#{config.root}/lib)您的config/application.rb配置块中,如下所示:

["/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"]
Run Code Online (Sandbox Code Playgroud)

所以,如果你有app/models/something/util.rb并且你在Something::Util某个地方打电话,它会调查这些路径,找到app/models/文件夹something/util.rb并加载它.

另一方面,Ruby并不关心这一点.纯Ruby中的自动加载工作如本页所述.您必须使用自动加载或直接需要文件(文件夹结构不会有任何意义).


Jos*_*eek 5

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

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

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