我们从 Ruby 中的 require 和 require_relative 方法 中学到了什么是绝对路径 ? 什么是相对路径。
我们也在 Ruby 中的 require 和 require_relative 方法 学习了如何使用 require
和 require_relative
方法加载一个文件或模块。
大家对 require
和 require_relative
有没有什么感觉 ? 会不会在脑海中烙上 「 require
和 require_relative
只会加载文件一次 」 ?
这种机制是非常有利的,它能保证一个模块只被加载一次,但也是不利的,因为只能加载一次,当我们需要实时动态加载某个文件或模块,或者需要多次加载某个文件或模块时,它们就使不上力了。
面对这种情况,Ruby 提供了 load
方法。
load 方法
准确的说,load
方法和 require
方法类似 ( 而不是 require_relative
),除了 load
方法每调用一次就会加载一次这个差别外。
但是在内部,load
方法还是有其它差别的,比如它并不会把已成功加载的文件或模块的绝对路径添加到 $LOADED_FEATURES
全局数组中。
为了理解这两个差别,我们使用一个小小的范例来演示下,假设当前目录下的文件结构和文件内容如下
$> tree . ├── counter.rb 0 directories, 1 file $> cat ./counter.rb $counter += 1
counter.rb
文件主要是使用 $counter
全局变量来计数。
然后我们就可以在当前目录下打开 irb 并使用 load
方法加载 counter.rb
文件多次
irb> $counter = 0 => 0 irb> load 'counter.rb' => true irb> $counter => 1 irb> load 'counter.rb' => true irb> $counter => 2 irb> $LOADED_FEATURES.grep /counter.rb/ => []
上面的代码中,我们给 load
方法传递了参数 counter.rb
,然后 load
就会尝试在当前工作目录下查找这个文件
当时,当加载成功后,我们并没有在 $LOADED_FEATURES
全局数组中看到刚刚加载的文件的绝对路径。
但每次加载成功后, $counter
计数器就会 +1