operator - ¿Qué es el doble colon de Ruby `::`?
ruby ternary operator (9)
¿Qué es este doble colon ::
? Por ejemplo Foo::Bar
.
Encontré una definition :
El
::
es un operador unario que permite acceder a las constantes, los métodos de instancia y los métodos de clase definidos dentro de una clase o módulo, desde cualquier lugar fuera de la clase o módulo.
¿De qué sirve el alcance (privado, protegido) si solo puede usar ::
para exponer algo?
¿De qué sirve el alcance (privado, protegido) si solo puede usar :: para exponer algo?
En Ruby, todo está expuesto y todo puede modificarse desde cualquier otro lugar.
Si está preocupado por el hecho de que las clases se pueden cambiar desde fuera de la "definición de clase", es probable que Ruby no sea para usted.
Por otro lado, si estás frustrado por el bloqueo de las clases de Java, Ruby es probablemente lo que estás buscando.
Agregando a las respuestas anteriores, es válido usar Ruby ::
para acceder a los métodos de instancia. Todos los siguientes son válidos:
MyClass::new::instance_method
MyClass::new.instance_method
MyClass.new::instance_method
MyClass.new.instance_method
Según las mejores prácticas, creo que solo se recomienda la última.
Este sencillo ejemplo lo ilustra:
MR_COUNT = 0 # constant defined on main Object class
module Foo
MR_COUNT = 0
::MR_COUNT = 1 # set global count to 1
MR_COUNT = 2 # set local count to 2
end
puts MR_COUNT # this is the global constant
puts Foo::MR_COUNT # this is the local "Foo" constant
Tomado de http://www.tutorialspoint.com/ruby/ruby_operators.htm
No, no es para acceder a todos los métodos, es un operador de "resolución", es decir, se usa para resolver el alcance (o la ubicación que puede decir) de un símbolo constante / estático.
Por ejemplo, en el primero de su línea, Rails lo usa para encontrar la clase Base dentro del ActiveRecord.Module, en el segundo se usa para ubicar el método de clase (estático) de la clase Rutas, etc., etc.
No se usa para exponer nada, se usa para "localizar" cosas alrededor de sus ámbitos.
Ruby on rails usa :: para resolución de espacio de nombres.
class User < ActiveRecord::Base
VIDES_COUNT = 10
Languages = { "English" => "en", "Spanish" => "es", "Mandarin Chinese" => "cn"}
end
Para usarlo:
User::VIDEOS_COUNT
User::Languages
User::Languages.values_at("Spanish") => "en"
Además, otro uso es: Al usar rutas anidadas
OmniauthCallbacksController
se define en los usuarios.
y la ruta es como
devise_for :users, controllers: {omniauth_callbacks: "users/omniauth_callbacks"}
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
end
Se trata de evitar que las definiciones entren en conflicto con otro código vinculado a su proyecto. Significa que puedes mantener las cosas separadas.
Por ejemplo, puede tener un método llamado "ejecutar" en su código y aún podrá llamar a su método en lugar del método "ejecutar" que se ha definido en alguna otra biblioteca que ha vinculado.
::
Le permite acceder a una constante, módulo o clase definida dentro de otra clase o módulo. Se utiliza para proporcionar espacios de nombres para que los nombres de métodos y clases no entren en conflicto con otras clases de diferentes autores.
Cuando ves ActiveRecord::Base
en Rails significa que Rails tiene algo como
module ActiveRecord
class Base
end
end
es decir, una clase llamada Base
dentro de un módulo ActiveRecord
que luego se hace referencia como ActiveRecord::Base
(puede encontrar esto en la fuente de Rails en activerecord-nnn / lib / active_record / base.rb)
Un uso común de :: es acceder a constantes definidas en módulos, por ejemplo,
module Math
PI = 3.141 # ...
end
puts Math::PI
El operador ::
no le permite omitir la visibilidad de los métodos marcados como privados o protegidos.
::
es básicamente un operador de resolución de espacio de nombres. Le permite acceder a elementos en módulos o elementos de nivel de clase en clases. Por ejemplo, digamos que tenías esta configuración:
module SomeModule
module InnerModule
class MyClass
CONSTANT = 4
end
end
end
Puede acceder a CONSTANT
desde fuera del módulo como SomeModule::InnerModule::MyClass::CONSTANT
.
No afecta los métodos de instancia definidos en una clase, ya que accede a aquellos con una sintaxis diferente (el punto).
Nota relevante: si desea volver al espacio de nombres de nivel superior, haga lo siguiente: :: SomeModule - Benjamin Oakes
module Amimal
module Herbivorous
EATER="plants"
end
end
Amimal::Herbivorous::EATER => "plants"
:: Se utiliza para crear un alcance. Para poder acceder a Constant EATER desde 2 módulos, debemos ampliar los módulos para alcanzar la constante.