Biến instance (@): thuộc về từng object riêng, mỗi instance có bản sao riêng.
Biến class (@@): chia sẻ giữa mọi instance của class và các subclass.
class Counter
@@total = 0 # class variable — dùng chung
def initialize(name)
@name = name # instance variable — riêng mỗi object
@@total += 1
end
def self.total = @@total
end
a = Counter.new("A")
b = Counter.new("B")
Counter.total # => 2Lưu ý: @@ được kế thừa xuống subclass — sửa ở subclass làm thay đổi class cha.
Nhiều Rubyist khuyên dùng class-level instance variable (@var trong context class) thay @@ để tránh rò rỉ.
Instance variable (@): belongs to each individual object; every instance has its own copy.
Class variable (@@): shared across all instances of the class and its subclasses.
class Counter
@@total = 0
def initialize(name)
@name = name
@@total += 1
end
def self.total = @@total
end
a = Counter.new("A")
b = Counter.new("B")
Counter.total # => 2Gotcha: @@ is inherited by subclasses — modifying it in a subclass affects the parent class too.
Many Rubyists prefer class-level instance variables (@var in a class context) over @@ to avoid leakage.