2010-09-24 15 views
14

Bazı demek olduğunu biliyoruz sınıf değişkenleri (örneğin @@class_var) yerine sınıf kapsamındaki (örn @instance_var) Ruby önlemek ve bir örnek değişkeni kullanmalısınız olmalıdır:Ruby'de @@ class_variables neden kaçınılmalıdır?

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

Neden sınıf değişkenleri kullanılmasıdır Ruby'de kaşlarını çattı mı?

+0

Ben oldukça yakın Ruby hakkında iki kitap okudum ve bunların ne siz :) – willcodejavaforfood

+0

Ayrıca bkz sınıf değişkenleri ve sınıf arasındaki [Fark ne alırsınız cevapları görmek için bu kadar ilginç söz örnek değişkenleri?] (https://stackoverflow.com/questions/3802540/difference-between-class-variables-and-class-instance-variables). –

cevap

27

Sınıf değişkenleri genellikle çünkü miras konularındaki bazen kafa karıştırıcı davranışın kötülense: Bunun yerine sınıf örnek değişkenler kullanırsanız

class Foo 
    @@foo = 42 

    def self.foo 
    @@foo 
    end 
end 

class Bar < Foo 
    @@foo = 23 
end 

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

elde edersiniz: Bu genellikle daha yararlıdır

class Foo 
    @foo = 42 

    def self.foo 
    @foo 
    end 
end 

class Bar < Foo 
    @foo = 23 
end 

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

.

6

Dikkatli olun; @@variables sınıfı ve örnek @variables aynı şey değildir. Bir temel sınıf bir sınıf değişken bildirmek

Esasen

, tüm alt sınıfları ile paylaşılır. Bir alt sınıftaki değerini değiştirmek, taban sınıfını ve alt sınıflarının tümünü tüm kalıtım ağacını aşağı doğru etkiler. Bu davranış, genellikle tam olarak ne istenen nedir. Ancak eşit olarak, bu davranışı, programcı tarafından yapılan değil programcı, ve özellikle programcı sınıfının bir başkası tarafından alt sınıf alt sınıfının olması beklenmediği hatalar, neden olur.

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