2015-11-30 14 views
10

So come aggiungere metodi di classe e comportamento di classe using self << class (eigenclass). Ma, durante la lettura some source code, ho visto un altro uso:Che cosa fa una definizione di classe all'interno di una classe << self do?

class LetterAvatar 
    class << self 
    class Identity 
    end 
    end 
end 

Come funziona? Che cosa fa e quando dovrebbe usarlo? Quale sarebbe un modo alternativo (forse più riconosciuto) per scrivere questo?

+3

è un modo per avere una costante privata, inaccessibile dall'esterno tramite il riferimento "LetterAvatar :: Identity'. –

risposta

3

Penso che l'abbiano fatto perché non avevano bisogno di questa classe altrove.

Senza aprire la classe singleton flusso apparirebbe come segue (supponendo ogni metodo definito in metaclasse dal codice originale sarebbe prefisso con self.):

Si può definire la Identity come

class LetterAvatar 
    class Identity 
    end 
end 

e quindi utilizzare la classe nel self.generate metodo come segue:

class LetterAvatar 
    # code omitted 
    def self.generate 
    identity = LetterAvatar::Identity.from_username(username) 
    # code omitted 
    end 
    # other class level methods defined with `self.` 
end 

Ma perché fare così se la classe Identity viene effettivamente utilizzata (e non è necessario accedervi da nessun'altra parte) nella classe singleton (in generate)?

La soluzione è IMO molto elegante, non ho mai visto nulla di simile prima.

+0

A quanto pare, * fanno * [usano la classe altrove] (https://github.com/discourse/discourse/blob/d41a8a21cc76fb50c0121942e7c04a1e8c34ffaa/app/controllers/user_avatars_controller.rb#L34). Quindi probabilmente non è privato, oppure dovrebbe essere considerato come tale, ma non viene applicato. – berkes

+0

Il mio comando precedente era errato: il discorso user_avatars_controller * lo usa, ma il suo codice non è probabilmente usato o in altro modo sovrascritto, perché, come si afferma correttamente, questa classe è privata e non può essere chiamata come tale. – berkes

Problemi correlati