 
 This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
| Managing Class Data | ||
|---|---|---|
| Code | Expected | Actual | 
| class Warning
  @@translations = { :en => 'Wet Floor',
                     :es => 'Piso Mojado' }
  def initialize(language=:en)
    @language = language
  end
  def warn
    @@translations[@language]
  end
end
Warning.new.warn | "Wet Floor" | "Wet Floor" | 
| Warning.new(:es).warn | "Piso Mojado" | "Piso Mojado" | 
| class Fate
  NAMES = ['Klotho', 'Atropos', 'Lachesis'].freeze
  @@number_instantiated = 0
  def initialize
    if @@number_instantiated >= NAMES.size
      raise ArgumentError, 'Sorry, there are only three Fates.'
    end 
    @name = NAMES[@@number_instantiated]
    @@number_instantiated += 1 
    puts "I give you... #{@name}!"
  end  
end
Fate.new | I give you... Klotho! | I give you... Klotho! | 
| Fate.new | I give you... Atropos! | I give you... Atropos! | 
| Fate.new | I give you... Lachesis! | I give you... Lachesis! | 
| Fate.new | ArgumentError: Sorry, there are only three Fates. ... | ArgumentError: Sorry, there are only three Fates. from (irb):18:in `initialize' from (irb):28 | 
| class Module
  def class_attr_reader(*symbols)
    symbols.each do |symbol|
      self.class.send(:define_method, symbol) do
        class_variable_get("@@#{symbol}")
      end
    end
  end
  def class_attr_writer(*symbols)
    symbols.each do |symbol|
      self.class.send(:define_method, "#{symbol}=") do |value|
        class_variable_set("@@#{symbol}", value)
      end
    end
  end
  def class_attr_accessor(*symbols)
    class_attr_reader(*symbols)
    class_attr_writer(*symbols)
  end
end
Fate.number_instantiated | NoMethodError: undefined method `number_instantiated' for Fate:Class ... | NoMethodError: undefined method `number_instantiated' for Fate:Class from (irb):49 | 
| class Fate class_attr_reader :number_instantiated end Fate.number_instantiated | 3 | 3 |