weixin_42371430 2010-05-21 12:24
浏览 312
已采纳

求教:ruby的类中多个Mixin的情况

有一段代码:


module Module1
def initialize
puts "init module1..."
end
def do_1
puts "do 1"
end
end
module Module2
def initialize
puts "init module2..."
end
def do_2
puts "do 2"
end
end

class Test
def initialize
puts "init Test..."
end
end
class NewTest < Test
include Module1
include Module2
def initialize
super
end
def do
do_1
do_2
end
end

t = NewTest.new
t.do



执行后结果如下:
引用
init module2...
do 1
do 2

请问NewTest的initialize中如何才能也调用到Module1和其超类Test的initialize?

我看到书上说,super调用的是其super class的同名函数,但是NewTest得superclass函数返回的是Test类。
由此看出super调用的仅是ancestors返回的继承关系列表的最上层的同名函数。

  • 写回答

3条回答 默认 最新

  • Hooopo 2010-05-21 12:24
    关注

    ruby里实例方法调用链是这样的:
    本身的方法 -> mix-in方法 -> 父类方法
    同时父类方法查找链也是遵循上面的顺序,直到祖先。。

    super只能向上移一个位置

    还有为啥调用了module2的方法,而没有调用mdule1的方法是因为相同级别的同名方法后面定义的会覆盖前面的。

    而你想用super直接跳到父类。。这个貌似ruby语法还不支持。。

    这里有一个帖子是讨论super super的:
    [url]http://www.pubbs.net/200905/ruby/107849-super-super-.html[/url]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 有没有帮写代码做实验仿真的
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题