¿Hay alguna diferencia entredos puntos dobles de Ruby (: :) operador diferencias de uso
module Foo
class Engine < Rails::Engine
end
end
y
module Foo
class Engine < ::Rails::Engine
end
end
¿Hay alguna diferencia entredos puntos dobles de Ruby (: :) operador diferencias de uso
module Foo
class Engine < Rails::Engine
end
end
y
module Foo
class Engine < ::Rails::Engine
end
end
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
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.que Ruby es esto? En 2.2.4 obtengo 3, 3 y 4 y muchas "advertencias de referencia de nivel superior ya referenciadas" –
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. –
¡La analogía del sistema de archivos es genial! gracias – CuriousMind
Fue tomado del libro "Metaprogramación Ruby" por Paolo Perrotta. Libro muy útil para profundizar en el conocimiento del Ruby. – Flexoid