彻底证明类变量的值是首次进入内存的值

彻底证明类变量的值是首次进入内存的值



[Copy to clipboard] [ - ]
这个还真没发现过......
运行结果是:
1
2
1
是这样的
include并不是简单的copy代码到include的类中,它只是建立一个指向到module中。并且某个class中如果include了多个module,那么它会以倒序串连起来地。也就是说,你上面的include A,B,那么在class C中是B---->A 这样的方式串连起这两个模块的。
因此:
1、你下面的include没有再发生作用了;
2、因为include A,B 中的逗号表达式是右序,因此,后装载的A,先装装的B,因此C的mixin的顺序是A-->B,所以这时取@@Foo的值,是A中的值——1 。
3、实际项目中千万别这么写,尽量避免多模块的命名冲突,会有想不到的情况发生,或者增加调试难度。
4、不要被上面输出的1,2所蒙蔽,你试着把class C注释掉,再执行一下看看,,就明白了开始输出的1/2,不是表示装载的顺序,装载的顺序应该是include的反序。
随便介绍一下,ruby搜索方法和属性顺序
1、自己类
2、所包含的所有mixin(include的反序搜索)
3、超类及超类的mixin

[ 本帖最后由 wtbwtb 于 2008-6-14 16:57 编辑 ]
你的解释没有分析类变量?
类变量是不用分析的了,你试试下面的例子就明白了:
module A
  Foo = 1
end
module B
  Foo = 2
end
class C
 include B,A

def z
 puts Foo
end
end

c=C.new
c.z
再调换一下B和A的include顺序看看
注意:
 include A,B和
 include A
  include B
产生的结果是不同的。原因在于逗号表达式的求值顺序
欢迎深入讨论!
期待中。加油!
分析得很彻底!ok.
学习了。