Ruby中的require、load、autoload

require、load、autoload是Kernel模块中定义的方法,因为Class类和Object类都混入了Kernel模块,因此不管self是对象仍是类,均可以调用这些方法。html

这三个方法都用来加载和执行其余文件,可是有细微的不一样,本文将从参数、函数执行、返回值三个方面简要介绍下这三个函数。ruby

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-loadui

  • 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-autoloadspa

  • 将filename与module关联,当第一次使用module时,使用require加载该文件;
  • 执行过程与require同样;
  • 成功返回nil,找不到文件会抛出LoadError。

4. 总结

这三个方法共同点:htm

  • 会搜索$:来寻找目标文件,找不到会抛出LoadError。

这三个方法大体能够以下区分:对象

  • require避免重复加载,无需指定扩展名;
  • load会重复加载,需指定扩展名;
  • autoload会在须要时用require加载,能避免重复加载,无需指定扩展名。

所以autoload反而更像require。get

相关文章
相关标签/搜索