2012-02-22 9 views
6

In ruby, sto iniziando a vedere una pratica abbastanza normale tra cui moduli e mixin denominati :: ModuleName :: ClassName, dove in passato era bello molto semplicemente ModuleName :: ClassName.Qual è la differenza in :: ModuleName :: ClassName e ModuleName :: ClassName

Quello che mi piacerebbe ottenere qui è una comprensione decente del perché questa pratica è stata vista più recentemente e che cosa fa in modo diverso.

Qual è la differenza?

Qual è il vantaggio (se il precedente non risponde a questo)?

Grazie in anticipo per l'input.

risposta

9

Se si inserisce lo :: all'inizio si fa riferimento allo spazio dei nomi globale, se non si fa riferimento al proprio spazio dei nomi corrente.

Generalmente, se non si dispone di una classe/modulo con lo stesso nome all'interno della classe/modulo, non è necessario utilizzare :: all'inizio.

class Customer 

    def to_s 
    "Customer global" 
    end 

end 


class Order 

    class Customer 
    def to_s 
     "Customer within order" 
    end 
    end 


    def initialize 
    puts Customer.new 
    puts ::Customer.new 
    end 


end 

Order.new 

sarà stampare

Customer within order 
Customer global 
+0

+1 per una spiegazione eccezionale con un semplice esempio. – nkm

2

Quando si esegue ::ModuleName::ClassName stai dicendo:

voglio di cercare ::ModuleName::ClassName presso lo spazio dei nomi radice, ignorando se viene rilevato questo codice all'interno di un altro modulo. Così, sarà sempre alla ricerca di una classe che ha nominato come ::ModuleName::ClassName e nient'altro

Quando si dice in questo modo ModuleName::ClassName, stai dicendo:

voglio di cercare ModuleName::ClassName ma guardando prima verso l'ambito corrente e poi verso gli altri ambiti. Quindi, se hai un modulo chiamato MyModule e questo mio modulo fa riferimento a ModuleName::ClassName quindi prova prima a trovare MyModule::ModuleName::ClassName quindi prova a risolvere ::ModuleName::ClassName.

Quando sto definendo un codice come questo utilizzo quasi sempre :: ModuleName :: ClassName per evitare conflitti di denominazione.

+0

Interessante, quindi suppongo che tu possa usarlo in entrambi i modi. Usa :: per verificare che non hai problemi di denominazione e non usare nulla se c'è una situazione che causerà un conflitto di denominazione? O vorresti a quel punto rinominare una classe? –

+0

Dipende, a volte hai un plugin o una gemma con lo stesso nome della tua classe (ho visto questo accadere io stesso con la gemma act_as_taggable) e ho finito per rinominare il mio modello. Al giorno d'oggi uso sempre :: quando utilizzo classi con nomi e io definisco sempre le mie classi con ** classe SomeModule :: SomeClass; fine ** invece di ** modulo SomeModule; class SomeClass; fine ; fine**. Alla fine, diventa molto più semplice cercare una classe con il suo nome completo. –

Problemi correlati