📄 07 - delegating method calls to another object.rb
字号:
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 endend4.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 # => 6OrdinalNumber.new(5) + 6 # => 11 OrdinalNumber.new(5) + OrdinalNumber.new(6) # => 11#---require 'forwardable'class AppendOnlyArray extend Forwardable def initialize @array = [] end def_delegator :@array, :<<enda = AppendOnlyArray.newa << 4a << 5a.size# NoMethodError: undefined method `size' for #<AppendOnlyArray:0xb7bf56f4 @array=[4, 5]>#---class RandomAccessHash extend Forwardable def initialize @delegate_to = {} end def_delegators :@delegate_to, :[], "[]="endbalances_by_account_number = RandomAccessHash.new# Load balances from a database or something.balances_by_account_number["101240A"] = 412.60balances_by_account_number["104918J"] = 10339.94balances_by_account_number["108826N"] = 293.01#---balances_by_account_number["104918J"] # => 10339.94balances_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>#---
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -