ruby 代码
- class A
- Const = "ok"
- class B
- Const = "ko"
- p Const.object_id
- end
- p Const.object_id
- end
如果你在irb中敲入上面的程序,可以发现,两次的object_id是不同的,虽然我们在B中可以看到上层目录中定义的Const,而且可以打印出它的值,但是想要给C赋值就是另外一回事了,ruby并不会认为这是在给上层目录中的C赋值,而是认为这是在目录A::B中新建了一个常量C,因为常量是不允许多次赋值的,这样自然不难理解为什么两者的object_id不一样了。
让我们多做一点儿尝试:
ruby 代码
- class A
- Const = "ok"
- def meth
- Const = "ko"
- end
- end
当我们在方法中试图改变一个常量的值得时候,程序会报错,这是显然的结果,但是从这里可以看出来,虽然在变量的可视区域上方法和类没有什么区别,但是在对变量的操作时,两者的区别还是很明显的。
让我们再来点儿其他好玩儿的尝试:
ruby 代码
- class A
- Const = "ok"
- class B
- p A::Const
- Const = "ko"
- p Const.object_id
- end
- p Const.object_id
- end
- class A
- Const = "ok"
- class B
- Const = "ko"
- end
- p A::B::Const.object_id
- p A::Const.object_id
- end
可以看到,我们可以通过命名空间(或者叫目录结构)来访问任意目录下定义的常量,当不指定目录结构的时候,首先从当前目录开始寻找,然后依次向上。