2010-09-24 35 views
14

Tôi biết rằng một số người nói rằng các biến lớp học (ví dụ @@class_var) nên tránh trong Ruby và nên sử dụng biến một thể hiện (ví dụ @instance_var) trong phạm vi lớp học thay vì:Tại sao nên tránh @@ class_variables trong Ruby?

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

Tại sao là việc sử dụng các biến lớp cau mày trong Ruby?

+0

Tôi đã khá gần đây đọc hai cuốn sách về Ruby và cả hai đều không nói ra điều đó rất thú vị để xem những gì bạn sẽ nhận được câu trả lời :) – willcodejavaforfood

+0

Xem thêm [Sự khác nhau giữa các biến lớp và lớp các biến mẫu?] (https://stackoverflow.com/questions/3802540/difference-between-class-variables-and-class-instance-variables). –

Trả lời

27

biến Lớp thường phỉ báng vì hành vi đôi khi khó hiểu của họ về thừa kế:

class Foo 
    @@foo = 42 

    def self.foo 
    @@foo 
    end 
end 

class Bar < Foo 
    @@foo = 23 
end 

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

Nếu bạn sử dụng các biến cá thể của lớp thay vào đó, bạn nhận được:

class Foo 
    @foo = 42 

    def self.foo 
    @foo 
    end 
end 

class Bar < Foo 
    @foo = 23 
end 

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

Đây thường là hữu ích hơn.

6

Hãy cẩn thận; lớp @@variables và ví dụ @variables không giống nhau.

Về cơ bản, khi bạn khai báo lớp học biến trong lớp cơ sở, nó được chia sẻ với tất cả các lớp con. Thay đổi giá trị trong một phân lớp sẽ ảnh hưởng đến lớp cơ sở và tất cả các lớp con của nó tất cả các con đường xuống cây thừa kế. Hành vi này thường chính xác là những gì là mong muốn. Nhưng cũng không kém, hành vi này không phải là ý định của lập trình viên và dẫn đến lỗi, đặc biệt nếu người lập trình không ban đầu mong đợi cho lớp là được phân loại bởi người khác.

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

Các vấn đề liên quan