Самый простой способ - отслеживать эту информацию в классе. Например, предположим, что у нас есть несколько FruitBaskets, которые могут содержать любое количество apples
и bananas
. В любой момент мы хотим узнать общее количество яблок и бананов во всех корзинах.
module FruitCounter
attr_accessor :apples, :bananas
def apples; @apples ||= 0; end
def bananas; @bananas ||= 0; end
end
class FruitBasket
class << self
include FruitCounter # Keeps track of the total for all FruitBaskets.
end
include FruitCounter
def apples=(v)
d = v - self.apples # Note the difference.
@apples = v # Set the new value for this instance.
self.class.apples += d # Adjust the total by the difference.
end
def bananas=(v)
d = v - self.bananas
@bananas = v
self.class.bananas += d
end
end
Давайте посмотрим на это в действии:
first = FruitBasket.new
=> #<FruitBasket:0x97be6f8>
first.apples = 10; first.bananas = 15
FruitBasket.apples
=> 10
FruitBasket.bananas
=> 15
Пока все хорошо. Как насчет другой корзины?
second = FruitBasket.new
=> #<FruitBasket:0x97b28e4>
second.apples = 30; second.bananas = 20
FruitBasket.apples
=> 40
FruitBasket.apples == first.apples + second.apples
=> true
А теперь давайте изменим содержимое первой корзины:
first.apples = 3
=> 3
FruitBasket.apples
=> 33
FruitBasket.apples == first.apples + second.apples
=> true
Вот, пожалуйста!