Ruby/Class/DelegateClass

Материал из Wiki.crossplatform.ru

(Различия между версиями)
Перейти к: навигация, поиск
м (1 версия: Импорт выборки материалов по Ruby)
 

Текущая версия на 17:55, 13 сентября 2010

Create HexNumber

require "delegate"
class HexNumber < DelegateClass(Fixnum)
  # The string representations of this class are hexadecimal numbers.
  def to_s
    sign = self < 0 ? "-" : ""
    hex = abs.to_s(16)
    "#{sign}0x#{hex}"
  end
  def inspect
    to_s
  end
end
puts HexNumber.new(10) * 2                         # => 20
puts HexNumber.new(10) + HexNumber.new(200)        # => 210



Delegating Method Calls to Another Object

require "delegate"
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"
OrdinalNumber.new(4).to_s                      # => "4th"
OrdinalNumber.new(102).to_s                    # => "102nd"
OrdinalNumber.new(11).to_s                     # => "11th"
OrdinalNumber.new(-21).to_s                    # => "-21st"
OrdinalNumber.new(5).succ                      # => 6
OrdinalNumber.new(5) + 6                       # => 11
OrdinalNumber.new(5) + OrdinalNumber.new(6)     # => 11