2012-04-05 9 views
5

C'è una differenza nell'uso traUtilizzo della classe << self, quando utilizzare classi o moduli?

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

e

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

Quando volete utilizzare uno sopra l'altro?

+0

Uno di questi ha una lettera in più rispetto all'altra? :) Cosa intendi con "c'è una differenza"? Uno è una classe, uno è un modulo e in entrambi stai entrando nell'eigenclass. – Phrogz

+0

Penso che intendo chiedere, quando useresti l'uno sull'altro. Ho modificato la domanda per riflettere questo. –

risposta

4

Il class<<self sembra essere una falsa pista, in quanto l'unica differenza qui è una classe contro un modulo. Forse stai chiedendo "Voglio creare un oggetto che non intendo istanziare, ma che esiste solo come spazio dei nomi per alcuni metodi (e possibilmente come un singleton con il proprio stato globale)."

Se questo è il caso, entrambi funzioneranno altrettanto bene. Se c'è qualche possibilità che si potrebbe desiderare di creare un derivato (un altro oggetto che eredita gli stessi metodi) allora si dovrebbe usare una classe come leggermente è più facile scrivere:

class Variation < Helper 

invece di

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

module Variation 
    extend Helper::OwnMethods 

Tuttavia, per il solo namespacing generalmente utilizzo un modulo su una classe, in quanto una classe implica che si verificherà l'istanziazione.

2

La differenza tra un modulo e una classe è che è possibile creare un'istanza di una classe, ma non un modulo. Se è necessario creare un'istanza di Helper (h = Helper.new), dovrebbe essere una classe. In caso contrario, probabilmente è meglio rimanere un modulo. Non sono sicuro di come il resto del codice sia pertinente alla domanda; se si dispone di metodi di classe su un modulo o una classe non è rilevante se è necessario creare istanze di tale oggetto.

Problemi correlati