From: Joel VanderWerf Date: 2006-10-26T14:49:25+09:00 Subject: Re: Popularity Contest: Initializing Class-Level Instance Variables Joel VanderWerf wrote: > Phrogz wrote: >> TECHNIQUE 2 - ON-DEMAND TEST/INITIALIZATION >> ------------------------------------------- >> class Alpha >> def self.m1; (@foo||=[]) << rand; end >> def self.m2; (@foo||=[]).map{ rand }; end >> end >> >> class Bravo < Alpha >> # Nothing special here >> end > > I prefer a variant of the above: Oops, midway through that exercise I forgot we were talking about class methods, not instance methods. The following runs correctly: require 'set' class Alpha def self.foo @foo ||= [] end def self.m1; foo << rand; end def self.m2; foo.map{ rand }; end # note that the expression for contstructing foo is not # repeated twice end class Bravo < Alpha # Nothing special here end class Charlie < Alpha def self.foo @foo ||= Set.new # or some other collection class end # This implies that all _subclasses_ of Charlie will # (unless overridden) use a set for the #foo method end class Delta < Charlie # default to Charlie's choice of Set as the foo collection end class Echo < Alpha @foo = [1,2,3] # possible to specify in advance end [Alpha, Bravo, Charlie, Delta, Echo].each {|c| p c.m1} [0.657784608794096] [0.340975041442558] # # [1, 2, 3, 0.58602201527139] -- vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407