Ruby与python的__init__相对应

时间:2014-10-20 16:29:14

标签: ruby

Python有模块和包,而包有__init__.py文件,因此如果我导入名为foo的包,解释器将查找foo/__init__.py

我遇到了一些ruby代码,它不包含模块,而是包含目录:require 'core/utilts'coreutilts是目录,而不是单个模块文件。 ruby对文件__init__.py的等价物是什么,或者当我需要像utilts目录这样的目录时执行的文件是什么?它下面有很多ruby文件。

3 个答案:

答案 0 :(得分:5)

您无法在Ruby中导入目录。如果您正在运行require 'core/utils',则会有一个名为core/utils.rb文件。可能是一个名为core/utils/的目录,但是它utils.rb通过require包含在内,而且它可能会包含文件core/utils/

因此,您的问题的答案是:不,没有等同于foo/__init__.py,但通常可以使用foo.rb完成同样的事情,其中​​包含foo/中的其他文件。

答案 1 :(得分:3)

Ruby不支持加载整个目录,但如果需要,它很容易做到:

Dir.glob('lib/*.rb').map do |p|
  require p
end

我使用了map,因为它会返回require响应,从而可以查看是否有内容无法加载,因为require返回true表示成功,false表示失败。失败/错误意味着文件没有被加载,因为它不需要,通常是因为它已经是其他东西。如果您不关心返回的值,请使用each代替map

您还可以执行“Adding a directory to $LOAD_PATH (Ruby)”中提到的技巧,然后使用require,而不在您要加载的文件前面添加任何路径。

答案 2 :(得分:2)

红宝石有点不同。通常ruby中的gem或“libraries”会修改LOAD_PATH常量,这是ruby解释器在调用require时查找文件的位置。因此,标准gem通过将lib目录附加到LOAD_PATH来工作,然后可以要求在该目录中命名空间的文件。通常,通常会有一个与库相同的文件,然后加载所有依赖项。

例如:使用以下项目。

lib/
 -- core/utils/
 -- core/utils.rb
core_utils.gemspec
你会打电话给:

require "core/utils"

并且utils.rb将加载core / utils路径中的所有文件。