2010-09-24 6 views
14

So che alcuni dicono che le variabili di classe (ad es @@class_var) dovrebbe essere evitare in Ruby e dovrebbe utilizzare la variabile un'istanza (ad es @instance_var) nel campo di applicazione della classe invece:Perché dovrebbe @@ class_variables essere evitato in Ruby?

def MyClass 
    @@foo = 'bar' # Should not do this. 
    @foo = 'bar' # Should do this. 
end 

Perché è l'uso di variabili di classe disapprovato in Ruby?

+0

ho poco tempo fa leggere due libri su Ruby e nessuno dei due ha menzionato questo modo interessante vedere quali risposte si otterrà :) – willcodejavaforfood

+0

Vedi anche [Differenza tra variabili di classe e la classe variabili di istanza?] (https://stackoverflow.com/questions/3802540/difference-between-class-variables-and-class-instance-variables). –

risposta

27

variabili di classe sono spesso diffamato causa del loro comportamento a volte confusa per quanto riguarda l'eredità:

class Foo 
    @@foo = 42 

    def self.foo 
    @@foo 
    end 
end 

class Bar < Foo 
    @@foo = 23 
end 

Foo.foo #=> 23 
Bar.foo #=> 23 

Se si utilizzano variabili di istanza di classe, invece, si ottiene:

class Foo 
    @foo = 42 

    def self.foo 
    @foo 
    end 
end 

class Bar < Foo 
    @foo = 23 
end 

Foo.foo #=> 42 
Bar.foo #=> 23 

Questo è spesso più utile.

6

Fare attenzione; classe @@variables e istanza @variables non sono la stessa cosa.

In sostanza, quando si dichiara una variabile di classe in una classe base, è condiviso con tutte le sottoclassi. La modifica del relativo valore in una sottoclasse influisce sulla classe base e su tutte le sottoclassi fino in fondo alla struttura di ereditarietà. Questo comportamento è spesso esattamente ciò che è desiderato. Altrettanto spesso, questo comportamento di non è quello previsto da programmatore, e porta a bug, specialmente se il programmatore non aveva previsto originariamente per la classe essere sottoclassata da qualcun altro.

Da: http://sporkmonger.com/2007/2/19/instance-variables-class-variables-and-inheritance-in-ruby