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.

Delegating Method Calls to Another Object
CodeExpectedActual
require 'delegate'
An integer represented as an ordinal number (1st, 2nd, 3rd...), as
opposed to a cardinal number (1, 2, 3...) Generated by the
DelegateClass to have all the methods of the Fixnum class.
class OrdinalNumber < DelegateClass(Fixnum)
  def to_s
    delegate_s = __getobj__.to_s
    check = abs
    if check == 11 or check == 12
      suffix = "th"
    else
      case check % 10
      when 1 then suffix = "st"
      when 2 then suffix = "nd"
      else suffix = "th"
      end
    end
    delegate_s + suffix
  end
end
4.to_s
"4" "4"
OrdinalNumber.new(4).to_s
"4th" "4th"
OrdinalNumber.new(102).to_s
"102nd" "102nd"
OrdinalNumber.new(11).to_s
"11th" "11th"
OrdinalNumber.new(-21).to_s
"-21st" "-21st"
OrdinalNumber.new(5).succ
6 6
OrdinalNumber.new(5) + 6
11 11
OrdinalNumber.new(5) + OrdinalNumber.new(6)
11 11
require 'forwardable'
class AppendOnlyArray
  extend Forwardable
  def initialize
    @array = []
  end
  def_delegator :@array, :<<
end
a = AppendOnlyArray.new
a << 4
a << 5
a.size
NoMethodError: undefined method `size' for #<AppendOnlyArray:0xb7bf56f4 @array=[4, 5]>
...
NoMethodError: undefined method `size' for #<AppendOnlyArray:0xb7bf56f4 @array=[4, 5]>
	from (irb):37
class RandomAccessHash 
  extend Forwardable
  def initialize
    @delegate_to = {}
  end
  def_delegators :@delegate_to, :[], "[]="
end
balances_by_account_number = RandomAccessHash.new
Load balances from a database or something.
balances_by_account_number["101240A"] = 412.60
balances_by_account_number["104918J"] = 10339.94
balances_by_account_number["108826N"] = 293.01
balances_by_account_number["104918J"]
10339.94 10339.94
balances_by_account_number.each do |number, balance|
  puts "I now know the balance for account #{number}: it's #{balance}"
end
NoMethodError: undefined method `each' for #<RandomAccessHash:0xb7be7298>
...
NoMethodError: undefined method `each' for #<RandomAccessHash:0xb7be7298>
	from (irb):50