2012-06-06 3 views

ответ

11

Swap класс переопределяет метод initialize, определенный в модуле Temp. Когда Ruby пытается найти метод, он ищет иерархию наследования, начиная с самого производного класса/модуля. В этом случае поиск заканчивается классом Swap.

Переопределенные методы не вызываются, если вы явно не назовете их super. Например

class Swap 
    include Temp 
    def initialize 
    p "m in class" 
    super 
    end 
end 

позвонит Temp#initialize из Swap#initialize.

9

Поскольку вы определили инициализацию как в классе, так и в модуле, и Ruby будет искать методы в своем классе, прежде чем перейти к другим классам/модулю.

Чтобы увидеть цепь предков, попробовать этот

s = Swap.new 
puts s.class.ancestors 

Вы увидите цепь, и знать, где Руби начинает находить свою функцию.

-3

Он вызывает конструктор только в пределах области действия.

Если вы хотите вызвать метод инициализатора модулей, вы должны вызвать его прямо так.

module Temp 
    def self.initialize 
    p "asdasd" 
    end 
end 

class Swap 
    include Temp 
    def initialize 
    p "m in class" 
    Temp.initialize 
    end 
end 

s = Swap.new 
+1

В этом примере, поскольку область действия действительно не нужна, это работает. Но если в области экземпляра Swap необходимо вызвать метод инициализации Temp #, вы столкнетесь с проблемами. – yaauie

+2

Вызов 'Temp.initialize' является анти-шаблоном -' super' - это правильный способ вызова метода 'initialize' суперкласса. –

Смежные вопросы