呵呵。共勉吧。比起社区很多人,我绝对是新新人类~ 哈哈
刚才回答你问题后,回来后,我又想到为什么不妨看看 Ruby 底层的操作码。
下面是操作码输出的一部分,前一块是父类 A 内混入模块 MyModule 的定义,后一块是子类 B 内混入同一模块的定义。
== disasm: <RubyVM::InstructionSequence:<class:A>@<compiled>>===========
0000 trace 2 ( 1)
0002 trace 1
0004 putnil
0005 getinlinecache 12, <ic:0>
0008 getconstant :MyModule
0010 setinlinecache <ic:0>
0012 send :include, 1, nil, 8, <ic:1>
0018 trace 4
0020 leave
== disasm: <RubyVM::InstructionSequence:<class:B>@<compiled>>===========
0000 trace 2 ( 1)
0002 trace 1
0004 putnil
0005 getinlinecache 12, <ic:0>
0008 getconstant :MyModule
0010 setinlinecache <ic:0>
0012 send :include, 1, nil, 8, <ic:1>
0018 trace 4
0020 leave
虽然我并不完全明白这些乱七八糟的伪码。不过可以很清楚的看出来,两次调用的参数是完全一样的。
send :include,1,nil,8,<ic:1>
这至少说明一点:这两次混入操作,都仅仅是方法调用而已,而且操作的是同样的位置的同样的对象。