 
 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 | ||
|---|---|---|
| Code | Expected | Actual | 
| 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 |