2016-04-27 6 views
0

Ich habe einen Anwendungsfall, wo ich class A haben, die module B umfasst.Anrufverfahren enthalten Modul aus der Klasse

class A 
    include B 

    def do_one_thing 
    # override module's method. do something different instead 
    end 

    def do_another_thing 
    # Call `do_one_thing` from here, 
    # but call the module's method, not the one I overrode above. 
    end 
end 

module B 
    included do 
    def do_one_thing 
     # ... 
    end 
    end 

    # some other methods 
end 

Wie oben gezeigt, ich rufe do_one_thing von do_another_thing. Mein Problem ist, dass ich das Modul des Verfahrens (das heißt die super-Methode) nennen. Ist das in Rails möglich?

+1

Mögliche Duplikat [Rubin Schlüsselwort super] 'speichern' können (http://stackoverflow.com/questions/2597643/ruby-super-keyword) – Hamms

Antwort

1

Um Eigenschaft verwenden Sie die included Methode, müssen Sie Ihr B Modul zu extend ActiveSupport::Concern, aber das wird nicht geben Sie das gewünschte Verhalten.

Wenn ich Sie wäre, würde ich dieses Muster verlassen und mit einfachen nativen Muster Ruby-Modul:

module B  
    def do_one_thing 
    puts 'in module' 
    # ... 
    end 

    # some other methods 
end 

class A 
    include B 

    def do_one_thing 
    super 
    puts 'in class' 
    # override module's method. do something different instead 
    end 

    def do_another_thing 
    do_one_thing 
    # Call `do_one_thing` from here, 
    # but call the module's method, not the one I overrode above. 
    end 
end 

A.new.do_one_thing 

Der obige Code wird korrekt das Modul Vererbung für Sie suchen.

Read more about Ruby module inheritance here

+0

Danke! Und Entschuldigung für meine späte Antwort. Das Problem dabei ist, dass ich nur die Methode des Moduls aufrufen muss (ohne die Methode der Klasse auszuführen). Bei anderen Gelegenheiten, ich brauche nur die Klassenmethode aufrufen, ohne das Modul des Verfahrens läuft ... –

+0

Sie ein paar Optionen. Es klingt wie du willst, ist zwei Methoden, die an verschiedenen Orten aufgerufen werden können. Wenn das nicht genug ist, könnten Sie versuchen, Verfeinerungen zu verwenden. Verfeinerungen ähneln Affenfeldern, haben aber einen viel eingeschränkteren Einflussbereich. Ich schrieb einen Beitrag über [mit Ruby Ergebnis] (http://jakeyesbeck.com/2015/12/13/ruby-refinements/), die eine hilfreiche Einführung sein könnte. – yez

0

Sie enthalten Verfahren vor Überschreibung

module B 
    extend ActiveSupport::Concern 

    included do 
    def do_one_thing 
     puts 'do_one_thing' 
    end 
    end 
end 

class A 
    include B 

    alias_method :old_do_one_thing, :do_one_thing 
    def do_one_thing 
    puts "I'd rather do this" 
    end 

    def do_another_thing 
    old_do_one_thing 
    end 
end 

a= A.new 
a.do_one_thing 
a.do_another_thing 
Verwandte Themen