2014-10-20 54 views
2

Python有模块和包,而包有__init__.py文件,所以如果我导入一个名为foo的包,解释器将查找foo/__init__.pyRuby与python的对应__init__

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

回答

5

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

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

+0

+1”有一个名为core/utils.rb的文件。“这就是它似乎工作的原因。 – 2014-10-20 16:38:33

2

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

例如:用以下项目。

lib/ 
-- core/utils/ 
-- core/utils.rb 
core_utils.gemspec 

你会打电话:

require "core/utils" 

和utils.rb将加载内核中的所有文件/ utils的路径。

3

红宝石不支持加载整个目录,但它很容易做的,如果需要,可以:

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,而没有任何路径作为要加载的文件的前缀。 “