2012-05-07 16 views

Respuesta

47

Constantes en Ruby se anidan como los archivos y directorios en el sistema de archivos. Por lo tanto, las constantes se identifican de manera única por sus rutas.

Haciendo una analogía con el sistema de archivos:

::Rails::Engine #is an absolute path to the constant. 
# like /Rails/Engine in FS. 

Rails::Engine #is a path relative to the current tree level. 
# like ./Rails/Engine in FS. 

Aquí está el ejemplo de posible error:

module Foo 

    # We may not know about this in real big apps 
    module Rails 
    class Engine 
    end 
    end 

    class Engine1 < Rails::Engine 
    end 

    class Engine2 < ::Rails::Engine 
    end 
end 

Foo::Engine1.superclass 
=> Foo::Rails::Engine # not what we want 

Foo::Engine2.superclass 
=> Rails::Engine # correct 
+0

Derecha. Por lo tanto, si llamara a Rails :: Engine desde un módulo con el nombre 'Module Foo', podría interpretarlo como' Foo :: Rails :: Engine'. He visto errores como este a veces y tuve que agregar el '' 'adicional al frente de un include. –

+1

¡La analogía del sistema de archivos es genial! gracias – CuriousMind

+5

Fue tomado del libro "Metaprogramación Ruby" por Paolo Perrotta. Libro muy útil para profundizar en el conocimiento del Ruby. – Flexoid

5
Rails::Engine #is a path relative to the current tree level. 
# like ./Rails/Engine in FS. 

Esto no es del todo cierto!

Tengamos un ejemplo:

module M 
    Y = 1 
    class M 
    Y = 2 
    class M 
     Y = 3 
    end 
    class C 
     Y = 4 
     puts M::Y 
    end 
    end 
end 

# => 3 

module M 
    Y = 1 
    class M 
    Y = 2 
    class C 
     Y = 4 
     puts M::Y 
    end 
    end 
end 

# => 2 

module M 
    Y = 1 
    class M 
    Y = 2 
    class M 
     Y = 4 
     puts M::Y 
    end 
    end 
end 

# => 4 

Así, cuando decimos M :: Y rubí mira hacia arriba para el Defintion más cercano sin importar si está dentro del ámbito actual o alcance externa o extensión externa externa

etc.
+0

que Ruby es esto? En 2.2.4 obtengo 3, 3 y 4 y muchas "advertencias de referencia de nivel superior ya referenciadas" –

Cuestiones relacionadas