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

xyy601 · 2019年09月14日 · 最后由 xyy601 回复于 2019年10月08日 · 1291 次阅读

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

对此产生了如下疑问:

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

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

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

共收到 6 条回复

假如有个文件 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 回复

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

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