最简单的方法是在课堂上跟踪这些信息。例如,假设我们有许多 FruitBaskets 可能包含任意数量的apples
and 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
给你!