2010-09-24 9 views
14

Wiem, że niektórzy mówią, że zmienne klasy (np @@class_var) powinien unikać w Ruby i należy użyć zmiennej instancję (np @instance_var) w zakresie klasy Zamiast:Dlaczego powinno się unikać @@ class_variables w Ruby?

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

dlaczego stosowanie zmiennych klasowych zmarszczył brwi w Ruby?

+0

Mam całkiem niedawno przeczytać dwie książki o Ruby i żaden z nich nie wspomniał o tym tak interesujące zobaczyć, co odpowiada dostaniesz :) – willcodejavaforfood

+0

Zobacz również [Różnica między zmiennymi klasy i klasy zmienne instancji?] (https://stackoverflow.com/questions/3802540/difference-between-class-variables-and-class-instance-variables). –

Odpowiedz

27

zmienne klasy są często oczerniany ze względu na ich czasami mylące zachowań dotyczących dziedziczenia:

class Foo 
    @@foo = 42 

    def self.foo 
    @@foo 
    end 
end 

class Bar < Foo 
    @@foo = 23 
end 

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

Jeśli używasz zmiennych instancji klasy zamiast tego dostaniesz:

class Foo 
    @foo = 42 

    def self.foo 
    @foo 
    end 
end 

class Bar < Foo 
    @foo = 23 
end 

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

To jest często bardziej użyteczne.

6

Należy zachować ostrożność; klasa @@variables i instancja @variables to nie to samo.

Zasadniczo, jeśli zadeklarować zmienną klasy w klasie bazowej, to wspólna wszystkie podklasy. Zmiana jego wartości w podklasie wpłynie na klasę podstawową i wszystkie jej podklasy od do końca drzewa dziedziczenia. To zachowanie często jest pożądane. Ale równie często zachowanie to nie jest zgodne z zamierzonym przez programistę i prowadzi do błędów, , zwłaszcza jeśli programista nie oczekiwał, że klasa jest podklasowana przez kogoś innego.

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

Powiązane problemy