首页 > 代码库 > Ruby中的require、load、autoload
Ruby中的require、load、autoload
require、load、autoload是Kernel模块中定义的方法,由于Class类和Object类都混入了Kernel模块,所以无论self是对象还是类,都可以调用这些方法。
这三个方法都用来加载和执行其他文件,但是有细微的不同,本文将从参数、函数执行、返回值三个方面简要介绍下这三个函数。
1. require(name) -> true or false or raise LoadError
http://ruby-doc.org/core-2.1.2/Kernel.html#method-i-require
- name可以是绝对路径,也可以是相对路径。Ruby会自动为name补充扩展名(.rb, .so, .etc);
- 函数执行时,如果name是绝对路径,则会去查找该文件;
- 通常name是相对路径,Ruby会在$:中的目录中搜索该文件。所以通常需要$:.unshift添加搜索路径;
- 找到该文件后,会运行该文件,并把该文件的绝对路径加入全局变量$"中,以此保证不重复加载;
- 第一次加载返回true,已经加载返回false,找不到文件会抛出LoadError。
2. load(filename, wrap=false) -> true or raise LoadError
http://ruby-doc.org/core-2.1.2/Kernel.html#method-i-load
- filename可以是绝对路径,也可以是相对路径。Ruby不会为filename添加扩展名;
- 函数执行时,如果filename是绝对路径,则会去查找该文件
- 通常filename是相对路径,Ruby会在$:中的目录中搜索该文件。所以通常需要$:.unshift添加搜索路径;
- wrap为true时,被加载文件会在一个匿名模块中执行,避免污染;
- load会加载文件并执行,成功会返回true,找不到文件会抛出LoadError。
3. autoload(module, filename) -> nil or raise LoadError
http://ruby-doc.org/core-2.1.2/Kernel.html#method-i-autoload
- 将filename与module关联,当第一次使用module时,使用require加载该文件;
- 执行过程与require一样;
- 成功返回nil,找不到文件会抛出LoadError。
4. 总结
这三个方法共同点:
- 会搜索$:来寻找目标文件,找不到会抛出LoadError。
这三个方法大致可以如下区分:
- require避免重复加载,无需指定扩展名;
- load会重复加载,需指定扩展名;
- autoload会在需要时用require加载,能避免重复加载,无需指定扩展名。
因此autoload反而更像require。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。