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

所有ruby文件都应该具有与文件夹结构匹配的模块结构吗?,ruby,module,idioms,Ruby,Module,Idioms,所有文件都在具有文件夹结构(类似于java包)的模块中,这是ruby约定吗 例如,如果我有一个文件结构 lib/people/utils 此处的文件是否具有模块结构,例如: module People module Utils # some functionality for People::Utils end end 我问这个问题的原因是因为我一直在阅读一些rails代码,似乎有几个文件在这样的文件结构中,但没有任何模块声明 我猜这将是这样的,您可以使用实用程序函

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

例如,如果我有一个文件结构

lib/people/utils

此处的文件是否具有模块结构,例如:

module People
  module Utils
    # some functionality for People::Utils
  end
end      
我问这个问题的原因是因为我一直在阅读一些rails代码,似乎有几个文件在这样的文件结构中,但没有任何模块声明

我猜这将是这样的,您可以使用实用程序函数,而不必包含
People::Utils


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

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

但不这样做是有道理的(最终你可以随心所欲地构造你的代码)。我偶尔会这样做,当有很多小班都在处理同一件事时,我把它们放在一起


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

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

您可以通过调用
rails控制台
来找到它们(这有点老套,可能有更简单的方法来显示它们):

config/application.rb
config块中,没有
config.autoload_路径+=%W(#{config.root}/lib)
的默认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
,并加载此文件


另一方面,鲁比并不在乎这个。在纯Ruby中自动加载的工作方式如上所述。您必须使用自动加载或直接要求文件(文件夹结构没有任何意义)。

并在更高版本的Rails中列出自动加载路径:
Rails.application.instance\u variable\u get(:“@\u all\u Autoload\u path”)
["/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"]