最も簡単な方法は、クラス内のこの情報を追跡することです。たとえば、とbananas
の任意の数を含むFruitBasketsがいくつかあるとします。いつでも、すべてのバスケットでリンゴとバナナの合計数を知りたいです。
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
あなたが行きます!