新手问题 有关 ruby 中 “load 中的参数 true” 的疑问

xyy601 · 2019年09月14日 · 最后由 Mark24 回复于 2020年07月11日 · 2128 次阅读

问题描述: 本人 ruby 经验尚浅,最近在阅读《Ruby 元编程》(第 2 版) 第二章,里面提到了 “load 中的参数 true”,书中描述:

对此产生了如下疑问:

1.这里的当前作用域之外和之内是指什么?

2.怎样以不污染命名空间的方式来调用其中的常量?

希望各位能举例说明下 load 方法带有 true 和不带 true 的区别。万分感谢大家的解惑!

假如有个文件 other.rb,内容是:

class Foo
  def foo
    puts 'foo'
  end
end

那么,在 main.rb 里 load 这个文件,

load 'other.rb', true # 因为是true,所以Foo这个类名就在这里看不到了

f = Foo.new # 这里会 uninitialized constant Foo (NameError)
f.foo()

但如果是 load 'other.rb', false

load 'other.rb', false # 因为是false,所以Foo这个类被带进了当前作用域

f = Foo.new # 这里就正常调用
f.foo()

用 true 参数的时候,我想大概是这样的吧

#main.rb
module M
  class Foo
    def foo
      puts 'foo'
    end
  end
end

M = nil # M应该是个不知道名字的模块

f = Foo.new #不管是Foo,还是M.Foo都没办法引用到了
f = M::Foo.new
miao 回复

谢谢您举的例子。 不过还有个疑问:文中所说的 “污染当前程序的命名空间” 是指什么意思呢?

xyy601 回复

当前命名空间,就是当前能够引用到的所有常量,变量,方法名的总集合,load 之后这个总集合里就多出 load 带来的新常量了,改变了这个总集合,所以叫 “污染” 吧。😅

xyy601 回复

其实就是污染当前的作用域,

本来你的作用域里面只有这几行代码,定义了哪些变量,清清楚楚,但是你 load 了以后相当于在这个作用域了多了几行代码,结果就是,你 load 里面定了一个方法,和这个作用域里的方法重名了,导致某些变量和预期不一致,比如本来应该继承来的方法,有可能被 load 进来的方法名给覆盖了

miao 回复

好的,谢谢你的解答

lyb124553153 回复

谢谢你的解答,明白是什么意思了😀

关于 load "file", true 还是想问。如果是这样的话,他在内部,执行完,又被删除。那意义是什么呢? 对于我来说,我并拿不到最新的包呀。

我也无法引用到他呀。

@miao @lyb124553153

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册