2011-01-28 8 views
5

Tengo un código heredado que estoy modificando. Sin embargo, estoy viendo algo extraño (para mí).¿Qué hace :: hacer?

que ver algo de código como esto:

::User.find_by_email(params[:user][:email]).update_attributes(:mag => 1) 

nunca he visto algo como esto (soy nuevo en Ruby on Rails). ¿Qué hace esto y por qué no funciona mi User.find_by_email(params[:user][:email]).update_attributes(:mag => 1)? El error dice algo sobre la constante User.

Estoy usando Rails 2.3.5 si eso ayuda.

Respuesta

17

:: es un operador de resolución de alcance, en la práctica significa "en el espacio de nombres", por lo ActiveRecord::Base significa "Base, en el espacio de nombres de ActiveRecord"

Una constante resolverse fuera de cualquier espacio de nombres significa exactamente lo que suena - una constante que no está en ningún espacio de nombres.

Se utiliza en lugares donde el código puede ser ambiguo sin ella:

module Document 
    class Table # Represents a data table 

    def setup 
     Table # Refers to the Document::Table class 
     ::Table # Refers to the furniture class 
    end 

    end 
end 

class Table # Represents furniture 
end 
2

que podrían encontrar una ventaja aquí: What is Ruby's double-colon `::`?

+1

Eso explica lo que hace el ::, pero no lo que un :: sin identificador de delante hace. :) –

+1

Cierto. No uso Ruby, pero el operador '::' parece ser un operador de resolución de alcance. Creo que ':: User' simpy significa el identificador de usuario global en el módulo actual. ¿Alguien puede confirmar? –

+0

Yo puedo. Ver mi respuesta :) –

4

Se asegura de cargar el modelo de usuario en el espacio de nombres global.

Imagine que tiene un modelo de Usuario global y otro Modelo de usuario en su módulo actual (Foo :: Usuario). Al llamar :: Usuario, asegúrese de obtener el global.

+0

Mismo entendimiento aquí – YOU

2

Rubí utiliza (entre otras cosas) ámbito léxico para encontrar nombres de constantes. Por ejemplo, si usted tiene este código:

module Foo 
    class Bar 
    end 

    def self.get_bar 
    Bar.new 
    end 
end 

class Bar 
end 

Los Foo.get_bar devuelve una instancia de Foo::Bar. Pero si ponemos :: delante de un nombre constante, obliga a Ruby a mirar solo en el nivel superior de la constante. Por lo tanto, ::Bar siempre se refiere a la clase de nivel superior Bar.

Te encontrarás con situaciones en Ruby donde la forma en que se está ejecutando tu código te obligará a utilizar estas referencias constantes 'absolutas' para llegar a la clase que deseas.

1

El operador "::" se usa para acceder a Clases dentro de módulos. De esa manera también puede acceder indirectamente a los métodos. Ejemplo:

module Mathematics 
    class Adder 
     def Adder.add(operand_one, operand_two) 
      return operand_one + operand_two 
     end 
    end 
end 

accede a este modo:

puts “2 + 3 = “ + Mathematics::Adder.add(2, 3).to_s