Classes like these need to make their new method private and also probably want to prevent copies from being made.
The following code demonstrates one way to do that:
~/rubytesting/TheRubyProgrammingLanguage/Chapter7ClassesAndModules$ cat -n LimitingTheNumberOfInstances.rb 1 class Season 2 NAMES = %w{ Spring Summer Autumn Winter } 3 INSTANCES = [] 4 5 def initialize(n) 6 @n = n 7 end 8 9 def to_s 10 NAMES[@n] 11 end 12 13 NAMES.each_with_index { |n,i| 14 season = new(i) 15 INSTANCES[i] = season 16 const_set n, season 17 } 18 19 private_class_method :allocate, :new 20 private :dup, :clone 21 end 22 23 if __FILE__ == $0 24 puts Season::Spring 25 puts Season::Summer 26 puts Season::Autumn 27 puts Season::Winter 28 endEl método const_set de la clase Module establece el valor asociado con el nombre pasado como primer argumento al objeto dado como segundo argumento:
>> Math.const_set("HIGH_SCHOOL_PI", 22.0/7.0) => 3.14285714285714 >> Math::HIGH_SCHOOL_PI => 3.14285714285714
Cuando se ejecuta el programa anterior produce esta salida:
~/rubytesting/TheRubyProgrammingLanguage/Chapter7ClassesAndModules$ ruby LimitingTheNumberOfInstances.rb Spring Summer Autumn Winter
Casiano Rodriguez León 2015-01-07