呵呵. 共勉吧. 比起社区很多人, 我绝对是新新人类~ 哈哈
刚才回答你问题后, 回来后, 我又想到为什么不妨看看 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>
这至少说明一点: 这两次混入操作, 都仅仅是方法调用而已, 而且操作的是同样的位置的同样的对象.