分享 发现 include A,B,C 这种写法,method lookup 时就是正向查找。。。

clc3123 · 2012年01月24日 · 最后由 googya 回复于 2012年02月04日 · 3264 次阅读

分三行写成: include A include B include C method lookup 就是反向从 C 开始找。。。 啊啊啊。。。

你贴代码啊,否则我猜不出你的预期到底是什么,以及结果是否跟你的预期不符? btw,请不要用这种调侃形式的帖子标题,而且我不明白你到底想要分享啥,建议你修改一下主贴以及标题。

1.9.2-p290 :001 > module A 1.9.2-p290 :002?> def foo 1.9.2-p290 :003?> puts "foo-A" 1.9.2-p290 :004?> end 1.9.2-p290 :005?> end => nil 1.9.2-p290 :006 > module B 1.9.2-p290 :007?> def foo 1.9.2-p290 :008?> puts "foo-B" 1.9.2-p290 :009?> end 1.9.2-p290 :010?> end => nil 1.9.2-p290 :011 > class C 1.9.2-p290 :012?> include A, B 1.9.2-p290 :013?> end => C 1.9.2-p290 :014 > C.new.foo foo-A => nil 1.9.2-p290 :015 > class D 1.9.2-p290 :016?> include A 1.9.2-p290 :017?> include B 1.9.2-p290 :018?> end => D 1.9.2-p290 :019 > D.new.foo foo-B => nil

#1 楼 @lgn21st 当时就是这样。。。看 rails 的代码学到不少东西啊

#2 楼 @clc3123 好多了,虽然你还可以再用 markdown 来格式化一下代码。 我觉得你提出的这个问题非常好,include ModuleA, ModuleB, ModuleC 这样的用法其实不多见,产生的结果也有点违背直觉,所以最好 include 的时候每行只 include 一个 module。

这里可以看出这两种 include 用法产生的区别:

>> C.included_modules
=> [A, B, Kernel]
>> D.included_modules
=> [B, A, Kernel]

这时正常的。 官方的 API 解释 include(args) private Invokes Module.append_features on each parameter in **reverse* order.

#3 楼 @lgn21st 学习了,原来可以这么来查

#4 楼 @hisea 原先一直是认为反向查找,看过的书中都没介绍一行之内全部 include 掉的情况~

嗯,这个之前确实没注意。。。以前只知道 include A include B 这样的写法

需要 登录 后方可回复, 如果你还没有账号请 注册新账号