问题描述: 本人 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
谢谢您举的例子。 不过还有个疑问:文中所说的“污染当前程序的命名空间”是指什么意思呢?
当前命名空间,就是当前能够引用到的所有常量,变量,方法名的总集合,load 之后这个总集合里就多出 load 带来的新常量了,改变了这个总集合,所以叫“污染”吧。
其实就是污染当前的作用域,
本来你的作用域里面只有这几行代码,定义了哪些变量,清清楚楚,但是你 load 了以后相当于在这个作用域了多了几行代码,结果就是,你 load 里面定了一个方法,和这个作用域里的方法重名了,导致某些变量和预期不一致,比如本来应该继承来的方法,有可能被 load 进来的方法名给覆盖了
好的,谢谢你的解答
谢谢你的解答,明白是什么意思了
关于 load "file", true 还是想问。如果是这样的话,他在内部,执行完,又被删除。那意义是什么呢? 对于我来说,我并拿不到最新的包呀。
load "file", true
我也无法引用到他呀。
@miao @lyb124553153