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

xyy601 · September 14, 2019 · Last by Mark24 replied at July 11, 2020 · 2348 hits

问题描述: 本人 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
Reply to miao

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

Reply to xyy601

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

Reply to xyy601

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

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

Reply to miao

好的,谢谢你的解答

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

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

我也无法引用到他呀。

@miao @lyb124553153

You need to Sign in before reply, if you don't have an account, please Sign up first.