2012-05-27 12 views
5

Ich versuche, ein Modul in einer Klasse zu mischen, und ich möchte, dass einige Methoden als Klassenmethoden und andere als Instanzmethoden fungieren.Klasse << Notation in Modulen

aber ich möchte nicht, sowohl includeundextend das Modul. Ich würde lieber nur include es.

Wenn ich die Methoden wickeln I Klassenmethoden in dieser Notation sein wollen, es funktioniert:

class << 
    # ... 
end 

Allerdings, wenn ich diese Notation verwenden funktioniert es nicht:

class << self 
    # ... 
end 

I vermuten, dass das Schlüsselwort self eine explizite Bindung an das Modul einführt und nicht die Klasse, in die es eingefügt wird. Aber ich habe keine Dokumentation gesehen, die empfiehlt, das Schlüsselwort self bei Verwendung der Notation class << zu lassen.

Weiß jemand, was hier vor sich geht?


UPDATE: Hier ist ein Beispielcode für mehr Klarheit:

module M 
    class << 
    def class_method 
     puts "From inside the class_method" 
    end 
    end 

    def instance_method 
    puts "From inside the instance_method" 
    end 
end 

class Object 
    include M 
end 

class C 
end 


C.class_method 

obj = C.new 
obj.instance_method 
+1

Huh, habe ich etwas verpasst? 'class << end' ist ein Syntaxfehler. – sepp2k

Antwort

6

class << muss immer von einem Objekt verfolgt werden. Nur class <<; end ist ein Syntaxfehler. In Ihrem Fall sieht es aus wie es wegen der folgenden Werke:

class << 
    def class_method 
    puts "From inside the class_method" 
    end 
end 

die gleiche wie

class << def class_method 
    puts "From inside the class_method" 
    end 
end 

ist, welche die gleiche wie

temp = def class_method 
    puts "From inside the class_method" 
end 
class << temp 
end 

ist, welche die gleiche wie

ist
def class_method 
    puts "From inside the class_method" 
end 
class << nil 
end 

was ist t er selbe wie

def class_method 
    puts "From inside the class_method" 
end 

Natürlich definiert das nicht wirklich eine Klassenmethode. Es definiert eine Instanzmethode.

+0

Lol. Das erklärt, warum die "scheinbare" Klassenmethode in Object arbeiten musste. Es war tatsächlich eine Singleton-Instanz-Methode. Gute Arbeit. – Nathan

0

Ja, wenn Sie ein echtes self in Ihrem Modul erhalten möchten Sie includedcallback verwenden sollten. So etwas wie dieser Punkt, den Sie in die richtige Richtung:

module Bar 
    def self.included(base) 
    class << base 
     def class_method 
     "class_method" 
     end 
    end 
    end 
end 

class Foo 
    include Bar 
end 


p Foo.class_method # => "class_method" 
+0

Ich glaube, das ist, was er eigentlich sein Problem lösen will, aber es beantwortet nicht die eigentliche Frage, was 'Klasse <<' im Vergleich zu 'Klasse << selbst tut. –

+0

wie @ sepp2k sagte "Klasse << Ende" ist ein Syntaxfehler. Also weiß ich eigentlich nicht, was Nathan bedeutet :( –

+0

Danke, nash, ich weiß über die mitgelieferte Methode, aber ich habe festgestellt, dass das Ausschalten des Selbsts einen ähnlichen Effekt erzielt. Ich bekomme keinen Syntaxfehler und habe es versucht Ruby 1.8 und 1.9.3 - Ich werde ein komplettes Codebeispiel in ein Bit posten, damit andere es versuchen können – Nathan

Verwandte Themen