2012-05-17 3 views
0

Можно ли сделать c1.say для отображения «lalala» без изменения M1, M2, C1? I.e., использовать дополнительные модули для переопределения метода M2? Спасибо,Как назвать супер методы, определенные в последовательности модулей в рубине

module M1 
    def word 
    "lalala" 
    end 
end 

module M2 
    def word 
    super + 'wawawa' 
    end 
end 

class C1 
    include M1 
    include M2 
    def say 
    puts word 
    end 
end 

c1 = C1.new 
c1.say # lalalawawawa 
+0

Это странное требование. У вас есть приложение для реального мира? –

+0

На самом деле, M1, M2 и C1 - все модули и классы в Rails, мы пытаемся переопределить методы M2, которые имеют супер внутри ... –

ответ

2

Вы всегда можете обезвредить любой класс без изменения его исходного кода.

module M1 
    def word 
    "lalala" 
    end 
end 

module M2 
    def word 
    super + 'wawawa' 
    end 
end 

class C1 
    include M1 
    include M2 
    def say 
    puts word 
    end 
end 

# patch M2 
M2.class_eval do 
    def word 
    super 
    end 
end 

# or patch C1 
# C1.class_eval do 
# def word 
#  'lalala' 
# end 
# end 


c1 = C1.new 
c1.say 
# >> lalala 
+0

Но мы хотим сохранить поведение супер метода, то есть нам нужно вызвать «super «... –

+0

Да, проверьте обновленный ответ :) –

+0

Он работает, спасибо! –

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

  • Нет связанных вопросов^_^