11

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

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

库/人/实用程序

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

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

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

我猜这将是您可以使用实用程序功能而不必包含People::Utils.

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

4

2 回答 2

16

它是 Rails 中的标准。Rails 加载模型的方式是通过查看文件夹结构来猜测类的位置。我们有所谓的autoload_paths.

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

app.instance_variable_get(:"@app").instance_variable_get(:"@_all_autoload_paths")

默认的 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"]

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

另一方面,Ruby 并不关心这些。普通 Ruby 中的自动加载按本页所述工作。您必须使用自动加载或直接要求文件(文件夹结构没有任何意义)。

于 2012-07-18T05:38:17.590 回答
4

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

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

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

于 2012-07-18T05:29:09.560 回答