2012-04-05 14 views
5

Gibt es einen Unterschied in der Nutzung zwischenVerwendung der Klasse << self, wann Klassen oder Module zu verwenden sind?

class Helper 
    class << self 
    # ... 
    end 
end 

und

module Helper 
    class << self 
    # ... 
    end 
end 

Wenn Sie einen über den anderen verwenden würde?

+0

Einer von ihnen hat einen zusätzlichen Buchstaben als der andere? :) Was meinst du mit "gibt es einen Unterschied"? Einer ist eine Klasse, einer ist ein Modul, und in beiden tritt man in die Eigenklasse ein. – Phrogz

+0

Ich denke ich möchte fragen, wann würdest du eins über das andere benutzen. Ich habe die Frage bearbeitet, um das zu reflektieren. –

Antwort

4

Die class<<self scheint ein Ablenkungsmanöver zu sein, da der einzige Unterschied hier eine Klasse gegenüber einem Modul ist. Vielleicht fragen Sie "Ich möchte ein Objekt erstellen, das ich nicht instanziieren möchte, das aber nur als Namespace für einige Methoden (und möglicherweise als Singleton mit eigenem, globalem Status) existiert."

Wenn dies der Fall ist, funktionieren beide gleich gut. Wenn es eine Chance, dass Sie ein Derivat (ein anderes Objekt den gleichen Methoden erben) erstellen möchten, dann sollten Sie eine Klasse verwenden, da es etwas einfacher ist, zu schreiben:

class Variation < Helper 

statt

module Helper 
    module OwnMethods 
    # Put methods here instead of class << self 
    end 
    extend OwnMethods 
end 

module Variation 
    extend Helper::OwnMethods 

Für nur Namespacing würde ich jedoch im Allgemeinen ein Modul über eine Klasse verwenden, da eine Klasse impliziert, dass Instanziierung auftreten wird.

2

Der Unterschied zwischen einem Modul und einer Klasse besteht darin, dass Sie eine Instanz einer Klasse, aber kein Modul erstellen können. Wenn Sie eine Instanz von Helper (h = Helper.new) erstellen müssen, sollte es eine Klasse sein. Wenn nicht, ist es wahrscheinlich am besten, ein Modul zu bleiben. Ich bin mir nicht sicher, wie der Rest Ihres Codes für die Frage relevant ist. Ob Klassenmethoden für ein Modul oder eine Klasse vorhanden sind, hängt nicht davon ab, ob Instanzen dieses Objekts erstellt werden müssen.

Verwandte Themen