Ruby 中的 load 方法浅谈

yufei       5 年, 8 月 前       865

我们从 Ruby 中的 require 和 require_relative 方法 中学到了什么是绝对路径 ? 什么是相对路径。

我们也在 Ruby 中的 require 和 require_relative 方法 学习了如何使用 requirerequire_relative 方法加载一个文件或模块。

大家对 requirerequire_relative 有没有什么感觉 ? 会不会在脑海中烙上 「 requirerequire_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

目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.