2010-03-10 23 views
62

Acabo de enterarme de las variables estáticas en php. ¿Hay algo así en ruby?variables estáticas en ruby ​​

Por ejemplo, si queremos crear una clase Student y para cada objeto student que creamos, su número de identificación debe aumentarse automáticamente.

Pensé que crear una variable de clase como estática sería suficiente.

+0

@ Andrew no hay ninguna mención de cualquier base de datos que está presente. – Oddmund

+0

@Oddmund Supuse que era por eso que el OP quería un número de identificación. –

Respuesta

97

Las variables de clase se comparten entre todas las instancias (por eso se llaman variables de clase), por lo que harán lo que quieran. También son heredados, lo que a veces conduce a un comportamiento bastante confuso, pero no creo que sea un problema aquí. He aquí un ejemplo de una clase que utiliza una variable de clase para contar cómo se han creado muchos ejemplos de ello:

class Foo 
    @@foos = 0 

    def initialize 
    @@foos += 1 
    end 

    def self.number_of_foos 
    @@foos 
    end 
end 

Foo.new 
Foo.new 
Foo.number_of_foos #=> 2 
+0

Gracias amigo ... Hice algo idiota en mi código, y malentendí por completo el concepto .... – levirg

+0

-1 Tu ejemplo tiene un inconveniente, foos de '@@ foos = 0' no es la misma variable con los otros dos , es una variable de clase de la clase 'Class' (Foo es una instancia de la clase Class), eliminaré el downvote si lo corrige. – clyfe

+4

@clyfe: Estás equivocado. Estás confundiendo variables de clase con variables de instancia. Haciendo 'clase Foo; @@ foo = "foo" end' establece la variable de clase '@@ foo' para Foo, no para Class. Pruébalo: 'clase Foo; @@ foo = 1 final; Objeto de clase; @@ foo end' producirá un 'NameError: variable de clase no inicializada @@ foo in Class'. – sepp2k

13

Usando la respuesta aceptada como la definición de la variable estática puede ser peligroso, y es un error común que He visto en un montón de código de Ruby.

Algo así como @@foos se comparte entre ALL subclases. Sin embargo, la mayoría de los programadores esperan que las variables estáticas tengan alcance solo dentro de la clase donde están definidas.

Si usted está buscando para las variables estáticas en el sentido de la mayoría de los idiomas, cuando su alcance sea sólo su propia clase, mira this SO answer

También esta entrada del blog tiene un buen ejemplo de la sorpresa mayoría de los programadores conseguirán:

http://www.railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/

+2

De hecho, se sorprenderá de la cantidad de personas con ideas erróneas que esperan que se comparta estática entre todas las subclases en otros idiomas: P –