operator ruby syntax operators

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.

http://en.wikipedia.org/wiki/Scope_resolution_operator


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.