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。

Ruby中的require、load、autoload,布布扣,bubuko.com

时间: 2024-08-05 07:07:55

Ruby中的require、load、autoload的相关文章

在 Ruby 中执行 Shell 命令的 6 种方法

我们时常会与操作系统交互或在 Ruby 中执行 Shell 命令.Ruby为我们提供了完成该任务的诸多方法. Exec Kernel#exec 通过执行给定的命令来替换当前进程,例如: $ irb >> exec 'echo "hello $HOSTNAME"' hello codefun $ 注意 exec 利用 echo 命令替换了 irb 进程,然后退出.因为 Ruby 实际上结束了该方法,所以只能有限使用.该方法的缺点是,你无法从 Ruby 脚本中知道命令是执行成功

Ruby中的遍历指定目录的文件方法

在ruby中我们要实现遍历指定目录的方法,网上的方法也非常之多,我们可以拿来参考参考,如下边的traverse.rb文件内容所示: #!/usr/bin/ruby  def traverse(filepath)     if File.directory?(filepath)       puts "Dirs:" + filepath       Dir.foreach(filepath) do |filename|         if filename != ".&quo

ruby中的win32ole使用

ruby中的win32ole是一个标准库,使用的时候只要添加require 'win32ole'就行. 下面是一段模拟一个登陆的代码 1 require 'win32ole' 2 3 ie = WIN32OLE.new('internetExplorer.application') 4 5 ie.visible = true 6 ie.navigate('www.***.cn') 7 8 sleep(0.2) until ie.busy == false 9 ie.Document.getEle

如何在Ruby中编写微服务?

[编者按]本文作者为 Pierpaolo Frasa,文章通过详细的案例,介绍了在Ruby中编写微服务时所需注意的方方面面.系国内 ITOM 管理平台 OneAPM 编译呈现. 最近,大家都认为应当采用微服务架构.但是,又有多少相关教程呢?我们来看看这篇关于用Ruby编写微服务的文章吧. 人人都在讨论微服务,但我至今也没见过几篇有关用Ruby编写微服务的.像样的教程.这可能是因为许多Ruby开发人员仍然最喜欢Rails架构(这没什么不好,Rails本身也没什么不好,但是Ruby可以做到的事还有很

ruby中的复制 dup clone

Ruby内置的方法Object#clone和Object#dup可以用来copy一个对象,两者区别是dup只复制对象的内容,而clone还复制与对象相关联的内容,如singleton method[ruby] view plaincopyprint?s = "cat" def s.upcase "CaT" end s_dup = s.dup s_clone = s.clone s_dup.upcase #=> "CAT" (singleto

谈谈Ruby中的类变量

Ruby中的类变量,很多文章都是不太建议使用的,主要原因在于他的一些特性容易导致犯一些错误,尤其在广泛使用元编程的时候. 初步接触类变量可能觉得他跟C++的类静态成员和Java中的静态变量没什么区别,但在实际使用中一不留神就会掉到类变量的陷阱中去 陷阱1,类变量跟类实例变量不同,类实例变量关联的是self,但类变量关联的是当前类作用域 class C end class D end class C @@var = "C" def D.getvar @@var end end class

(补充1)Ruby中的p、puts、print对比

p 和 puts 是 Ruby 中特别常用的方法,很多童鞋可能认为它们是差不多的,使用的时候也不加注意,但是仔细考究起来,它们是有明显差别的. 先举一个例子: class Foo def inspect "foo from inspect" end def to_s "foo from to_s" endendfoo = Foo.newp fooputs foop "p: <#{foo}>"puts "puts: <#

理解Ruby中的作用域

作用域对于Ruby以及其它编程语言都是一个需要理解的至关重要的基础知识.在我刚开始学习ruby的时候遇到很多诸如变量未定义.变量没有正确赋值之类的问题,归根结底是因为自己对于ruby作用域的了解不够,但在你看看完我的这篇文章后,相信你不会再担心会遇到这些头疼的问题. 什么是作用域? 当谈论到作用域的时候,应该马上想到变量和可见性这两个词,变量和可见性是作用域的主要内容,没错,作用域就是关于在代码的什么地方什么变量是可见的,当你充分了解了作用域后,给你一段代码,你可以轻易知道此时什么变量是可见的,

关于ruby中的空指针保护(||=)

平时我们在写代码,构造嵌套数据或者给某个变量初始化时会用到下面这种形式: a ||= []  ; a = b || c ; a = a || [] 这种形式可以保证,在这些变量要被访问的时候才进行初始化,给我们构造数据带来了极大的灵活性:而这就是ruby中的空指针保护的应用. 要理解空指针保护的工作方式,要从ruby真假值和||操作法两方面着手: 首先,在ruby中除了nil和false被作为false外,其它值就被认为是true 其次,表面上||操作符会在两个表达式中任何一个为true时返回t