2012-02-22 16 views
6

En ruby, estoy empezando a ver una práctica bastante normal que incluye módulos y mixins a los que se hace referencia como :: ModuleName :: ClassName, donde en el pasado era bonita mucho solo ModuleName :: ClassName.¿Cuál es la diferencia en :: ModuleName :: ClassName y ModuleName :: ClassName

Lo que me gustaría obtener aquí es una comprensión decente de por qué esta práctica se está viendo más últimamente y lo que hace de manera diferente.

¿Cuál es la diferencia?

¿Cuál es el beneficio (si el anterior no responde esto)?

Gracias de antemano por su contribución.

Respuesta

9

Si coloca el :: al principio, se refiere al espacio de nombre global, si no lo hace se está refiriendo a su espacio de nombre actual.

Por lo general, si no tiene una clase/módulo con el mismo nombre dentro de su clase/módulo, no necesitaría usar el :: al principio.

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 

imprimirá

Customer within order 
Customer global 
+0

+1 para una explicación increíble con un ejemplo simple. – nkm

2

Al hacer ::ModuleName::ClassName que dice:

quiero que busca ::ModuleName::ClassName en el espacio de nombres raíz, ignorando si no se encuentra el código dentro de otro modulo Por lo tanto, siempre buscará una clase que se denomina como ::ModuleName::ClassName y nada más

Cuando usted dice que como esto ModuleName::ClassName, que dice:

quiero que busca ModuleName::ClassName pero mirando en el alcance actual primero y luego en los otros ámbitos. Entonces, si tiene un módulo llamado MyModule y este mi módulo hace referencia a ModuleName::ClassName, primero intente buscar MyModule::ModuleName::ClassName y luego intente resolver ::ModuleName::ClassName.

Cuando estoy definiendo un código como este, casi siempre uso :: ModuleName :: ClassName para evitar conflictos de nomenclatura.

+0

Interesante, así que supongo que puedes usarlo de cualquier manera. Use :: para verificar que no tenga problemas de nomenclatura, y no use nada si hay una situación que cause un conflicto de nomenclatura. ¿O en ese momento, cambiarías el nombre de una clase? –

+0

Eso depende, a veces tienes un plugin o gema con el mismo nombre que tu clase (he visto esto pasarme con la gema acts_as_taggable) y terminé renombrando mi modelo. Hoy en día siempre uso :: cuando uso clases con espacios de nombres y siempre defino mis clases con ** class SomeModule :: SomeClass; fin ** en lugar de ** módulo SomeModule; clase SomeClass; fin ; fin**. Al final, se vuelve mucho más simple buscar una clase por su nombre completo. –

Cuestiones relacionadas