2015-09-24 45 views
2

的幾個包括模塊的初始化「如果我有一個模塊插入一個類,它有initialize定義,我可以用super稱之爲:調用在Ruby中

module M 
    def initialize(x) 
    @m = x 
    end 
end 

class MyClass 
    def initialize 
    super(3) 
    end 

    def val 
    @m 
    end 
end 

MyClass.new.val 
# => 3 

但是,如果我我怎麼代碼本有幾個模塊,也可能是一個父類?

class Parent 
    def initialize(x) 
    @p = x 
    end 
end 

module M 
    def initialize(x) 
    @m = x 
    end 
end 

module N 
    def initialize(x) 
    @n = x 
    end 
end 

class MyClass < Parent 
    include M 
    include N 
    def initialize 
    # ???? How to initialize here? 
    end 

    def val 
    [@m,@n,@p] 
    end 
end 

我猜內MyClass::initializesuper(100)將設置可變@n,因爲N是「最近」的祖先,但我怎麼叫initialize方法MParent

回答

2

看看這篇博文(http://stdout.koraktor.de/blog/2010/10/13/ruby-calling-super-constructors-from-multiple-included-modules/)。它解釋了你如何使用來自不同包含模塊的initialize

+0

偉大的文章!我不認爲我自己會得到這個解決方案。 IMO,Ruby中的當前實現 - 讓'super'選擇與參數列表匹配的祖先層次結構中的下一個'initialize',並跳過所有其他' - 是這種語言的糟糕設計點。如果有'initialize'方法,那是有原因的,它永遠不應該被默默地跳過.... – user1934428