Joel VanderWerf
10/26/2006 5:49:00 AM
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]
#<Set: {0.191071815451883}>
#<Set: {0.971105015466828}>
[1, 2, 3, 0.58602201527139]
--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407