2012-02-02 17 views
5

Gente, sto imparando il rubino e recentemente mi sono trasferito da JAVA. In JAVA potrei rendere una variabile membro di una classe statica e quella variabile membro rimarrebbe la stessa attraverso le istanze della classe. Come ottengo lo stesso in ruby. Ho fatto qualcosa di simile nella mia classe ruby:Metodo di classe in Ruby (equivalente statico in JAVA)

class Baseclass 

    @@wordshash 

end 

Questo sembra servire allo scopo finora mentre sto testando questo, cioè @@ wordhash rimane la stessa istanze attraverso di BaseClass. La mia comprensione è corretta.

Inoltre, volevo avere un metodo membro nella classe equivalente a un metodo statico in JAVA (non è necessario avere un'istanza della classe per accedervi). Come posso fare questo? Per esempio io voglio avere un metodo nel BaseClass come getwordshash(), che restituisce @@ wordshash e l'utente di tale metodo non dovrebbe avere per fare un esempio di BaseClass() Quindi, qualcosa di simile:.

class Baseclass 

    @@wordshash 

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

e poi posso utilizzarlo come

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

mi scuso se questa è una domanda molto ingenuo, io sono veramente nuovo al rubino, ma molto entusiasta di imparare.

risposta

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

In realtà, la convenzione di solito non ha il tipo. Sarebbe '@@ words' piuttosto che' @@ words_hash'. –

12

Utilizzando variabili di classe come il deposito statico ha conseguenze non volute nelle classi secondarie. È possibile implementare facilmente un archivio statico dichiarando una variabile di istanza a livello di classe.

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 

Cerchiamo di stampare i nomi statici

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

Cerchiamo di stampiamo l'istanza variabile

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

Cerchiamo di impostare la variabile di istanza e cercare di stamparlo di nuovo

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

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

Lasciaci stampare la variabile statica di nuovo

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

Io uso il termine static liberamente. In realtà entrambe le variabili sono variabili di istanza. Il @names dichiarato nel contesto della classe è una variabile di istanza per l'oggetto classe e @names all'interno di un metodo è la variabile di istanza di un'istanza della classe . Dato che ci sarà sempre un oggetto che rappresenta il tipo Foo, possiamo considerare @names dichiarato nel contesto di classe come una variabile statica.

+0

è possibile utilizzare alcune varianti della stenografia: 'attr_accessor' per accedere a queste variabili di istanza di quasi classe? –

+1

@DennisHodapp hai provato a usare i metodi 'cattr_accessor' e' mattr_accessor'? –

+0

no, non ho, ma sembra che tali accessors siano estensioni di rail e preferirei non doverle importare per un'applicazione Ruby. –

Problemi correlati