2010-11-11 5 views
0

Je suis en train d'écrire un module qui remplace une méthode d'instance dans la classe, il est inclus dansComment un module écrase-t-il une méthode dans la classe parente d'une classe dans laquelle il est inclus?

Cela ne fonctionne pas.

require 'active_support' 

class Foo 
    def bar 
    "bar" 
    end 
end 

module NewFoo 
    extend ActiveSupport::Concern 

    included do 
    alias __bar__ bar 
    end 

    def bar 
    "new " + __bar__ 
    end 
end 

class Baz < Foo 
    include NewFoo 
end 

Mon attente est que Baz.new.bar.should eql "new bar" mais je reçois un undefined local variable or method '__bar__' Erreur.

J'ai essayé des variantes de ce qui précède, y compris l'ancienne voie via def self.include(base)... en vain.

Des pointeurs?

Répondre

3

Il y a cette grande nouvelle invention appelée héritage:

module NewFoo 
    def bar 
    'new ' + super 
    end 
end 

Ou plus idiomatiques

"new #{super}" 
+0

Doh. Nous regardions notre écran depuis trop longtemps. Thnx. –

+0

@hakanensari: Je connais le sentiment. Une fois, j'ai passé une matinée entière à me défouler avec une logique de bouclage compliquée, essayant de trouver la manière la plus élégante de faire une «injection» qui fait la même chose pour tous les éléments sauf le dernier. Puis un ami aperçoit un aperçu du code et dit: "Vous * savez * que c'est juste" Array # rejoindre ", n'est-ce pas?" –

Questions connexes