2012-02-02 24 views
5

Amigos, estoy aprendiendo ruby ​​y recientemente me mudé de JAVA. En JAVA podría hacer que una variable miembro de una clase sea estática y esa variable miembro permanecería igual en todas las instancias de la clase. ¿Cómo logro lo mismo en ruby? Hice algo como esto en mi clase de rubí:Método de clase en Ruby (equivalente a static en JAVA)

class Baseclass 

    @@wordshash 

end 

Esto parece servir al propósito hasta ahora, mientras estoy probando esto, es decir @@ wordhash sigue siendo el mismo a través de las instancias de la clase base. Es mi entendimiento correcto

Además, quería tener un método miembro en la clase que sea equivalente a un método estático en JAVA (no necesito tener una instancia de la clase para acceder a esto). ¿Cómo puedo hacer esto? Por ejemplo, yo quiero tener un método en la clase base como getwordshash() que devuelve @@ wordshash y el usuario de ese método no debería tener que hacer una instancia de la clase base() Así que algo como esto:.

class Baseclass 

    @@wordshash 

    #static or class method 
    def getwordhash() 
    return @@wordshash 
    end 
end 

y luego puedo usarlo como

#without making an instance 
@hash = Baseclass.getwordhash() 

me disculpo si esto es una pregunta muy ingenua, soy realmente nuevo al rubí, pero muy contentos de aprender.

Respuesta

7
def self.getwordhash 
    @@wordshash 
end 

Con Ruby and Rails Naming Conventions:

class Baseclass 

    @@words_hash = Hash.new 

    def self.words_hash 
    @@words_hash 
    end 
end 
+2

En realidad, la convención no suele tener el tipo. Sería '@@ words' en lugar de' @@ words_hash'. –

12

Utilizando las variables de clase como la tienda estática tiene consecuencias no deseadas en subclases. Puede implementar fácilmente el almacenamiento estático declarando una variable de instancia en el nivel de clase.

class Foo 

    # initialize a static variable 
    @names = ['Tom', 'Dick', 'Harry'] 

    # class method (notice the self. prefix 
    def self.names 
    @names 
    end 

    # instance methods 

    def names 
    @names 
    end 

    def names=val 
    @names = val 
    end 

end 

Vamos a imprimir los nombres estáticos

>> Foo.names 
=> ["Tom", "Dick", "Harry"] 

Vamos a imprimir la instancia de variable

>> f = Foo.new 
>> f.names 
=> nil 

Vamos a establecer la variable de instancia e intente imprimir de nuevo

>> f.names=["Bob", "Danny"] 
=> ["Bob", "Danny"] 

>> f.names 
=> ["Bob", "Danny"] 

Déjenos imprimir la variable estática de nuevo

>> Foo.names 
=> ["Tom", "Dick", "Harry"] 

uso el término static sin apretar. En realidad, ambas variables son variables de instancia. El @names declarado en el contexto de clase es una variable de instancia para el objeto de clase Foo y @names dentro de un método es la variable de instancia de una instancia de clase Foo. Como siempre habrá un objeto que represente el tipo Foo, podemos considerar que @names declarado en el contexto de clase es una variable estática.

+0

¿es posible usar alguna variación de la taquigrafía: 'attr_accessor' para acceder a estas variables de instancia de cuasi clase? –

+1

@DennisHodapp ¿Has probado con los métodos 'cattr_accessor' y' mattr_accessor'? –

+0

no, no, pero parece que esos accesos son extensiones de rieles y preferiría no tener que importarlos para una aplicación de Ruby. –

Cuestiones relacionadas