2013-09-08 16 views
13

Diese Frage bezieht sich direkt auf this one. Aber ich habe versucht, es auf das Basisproblem zu reduzieren, und ich wollte nicht noch mehr Text in das andere Fragefeld eingeben. Also hier gehts:So stellen Sie Klassenmethoden vor

Ich weiß, dass ich classmethods durch Erweiterung des Moduls ClassMethods und einschließlich es über den Modul # include Hook einschließen kann. Aber kann ich das gleiche mit Prepend machen? Hier ist mein Beispiel:

Klasse Foo:

class Foo 
    def self.bar 
    'Base Bar!' 
    end 
end 

Klasse Extensions:

module Extensions 
    module ClassMethods 
    def bar 
     'Extended Bar!' 
    end 
    end 

    def self.prepended(base) 
    base.extend(ClassMethods) 
    end 
end 
# prepend the extension 
Foo.send(:prepend, Extensions) 

Klasse FooE:

require './Foo' 

class FooE < Foo 
end 

und ein einfaches Startscript:

require 'pry' 
require './FooE' 
require './Extensions' 

puts FooE.bar 

Wenn ich das Skript starte, bekomme ich Extended Bar! nicht wie erwartet, sondern . Was muss ich ändern, um richtig zu funktionieren?

Antwort

18

Das Problem ist, dass, obwohl Sie das Modul sind vorangestellt wird, ClassMethods noch in extend ed wird immer Sie können dies tun, um zu bekommen, was Sie wollen.

module Extensions 
    module ClassMethods 
    def bar 
     'Extended Bar!' 
    end 
    end 

    def self.prepended(base) 
    class << base 
     prepend ClassMethods 
    end 
    end 
end 

Beachten Sie, dass Extensions selbst sein könnte entweder vorangestellter oder in Foo enthalten. Der wichtige Teil ist das Voranstellen ClassMethods.

+0

Very nice! Danke vielmals. Offensichtlich wusste ich nicht, wie weit das geht. – Nessuno

+0

Großartig, danke ... – Fabio

24

Eine einfachere Version:

module Extensions 
    def bar 
    'Extended Bar!' 
    end 
end 

Foo.singleton_class.prepend Extensions 
+1

Danke, so einfach, wenn Sie es sehen ... – 244an

Verwandte Themen