2012-06-21 28 views
5

Như tôi đang duyệt qua một mã nguồn Rails, nó chứa dòng:@@ có nghĩa là gì trong Ruby?

@@autoloads = {} 

không @@ có ý nghĩa gì trong Ruby?

+0

chỉ muốn thêm, sự đồng thuận chung là các biến mẫu lớp lợi ích trên các biến lớp. http://thinkrelevance.com/blog/articles/2006/11/16/use-class-instance-variables-not-class-variables – Dty

+1

Biểu tượng là hữu ích cho việc tìm kiếm những thứ như thế này. –

Trả lời

2

Điều này có nghĩa là truy cập thuộc tính lớp (thuộc tính được đặt tên cho lớp), không phải là một cá thể (thuộc tính tồn tại cho từng đối tượng được tạo từ lớp đó).

Trong ví dụ của bạn, @@autoloads sẽ tiếp tục tồn tại trong thời lượng chương trình của bạn.

class TestObj 
    @@prop = 0 
    def get_prop 
     @@prop 
    end 

    def increment_prop 
    @@prop += 1 
    end 
end 

a = TestObj.new 
b = TestObj.new 

a.increment_prop 

puts b.get_prop # 1 

CodePad

+0

Cảm ơn bạn - Tôi hiểu rằng @ là các biến mẫu nhưng vẫn còn khá mới đối với Ruby. – sdasdadas

+0

Một điều cần lưu ý là các biến lớp trong một lớp cha là * không * được kế thừa bởi các lớp con. Tôi đã biết rất nhiều Rubyists mới từng chút một. – x1a4

+0

Biến lớp được kế thừa ('@@ ...'), nhưng các biến * instance * ('@ ...') là duy nhất cho mỗi lớp bất kể phân cấp. Bạn cũng sẽ nhận được cảnh báo "uninitialized" trên các biến lớp không bao giờ xảy ra với các biến mẫu. – tadman

1

@@ xác định một biến lớp.

+0

Cảm ơn, Google đã tìm kiếm câu trả lời này một chút khó khăn. – sdasdadas

1

@@ chẳng là gì ngoài việc chỉ ra biến lớp.

Biến lớp là biến được chia sẻ giữa tất cả các phiên bản của một lớp. Điều này có nghĩa là chỉ có một giá trị biến tồn tại cho tất cả các đối tượng được khởi tạo từ lớp này.

Cách suy nghĩ khác về suy nghĩ của biến lớp là biến toàn cầu trong ngữ cảnh của một lớp đơn lẻ.