RubyPulse Episode 0.27 - multimethod

... implements dispatch of methods based on argument types. - Kurt

rubypulse ~ $ cat mm.rb
class A
  def foo( x )
    case x
    when Fixnum
      "Fixnum #{x.inspect}"
    when Numeric
      "Numeric #{x.inspect}"
    else
      "#{x.inspect}"
    end
  end
end

rubypulse ~ $ irb
irb(main):001:0> load 'mm.rb'
=> true
irb(main):002:0> a = A.new
=> #
irb(main):003:0> a.foo :a
=> ":a"
irb(main):004:0> a.foo :a1
=> "Fixnum 1"
irb(main):005:0> a.foo 1.2
=> "Numeric 1.2"

rubypulse ~ $ irb
irb(main):002:0> require 'rubygems'
irb(main):010:0* require 'multimethod'
=> true
irb(main):011:0> 
irb(main):012:0* class A
irb(main):013:1>   multimethod %q{
irb(main):014:1'   def foo(x) # matches any argument type
irb(main):015:1'      "#{x.inspect}"
irb(main):016:1'   end
irb(main):017:1'   }
irb(main):018:1> 
irb(main):019:1*   multimethod %q{
irb(main):020:1'   def foo(Fixnum x) # matches any Fixnum
irb(main):021:1'      "Fixnum #{x.inspect}"
irb(main):022:1'   end
irb(main):023:1'   }
irb(main):024:1> 
irb(main):025:1*   multimethod %q{
irb(main):026:1'   def foo(Numeric x) # matches any Numeric
irb(main):027:1'      "Numeric #{x.inspect}"
irb(main):028:1'   end
irb(main):029:1'   }
irb(main):030:1> end
=> nil
irb(main):031:0> A
=> A
irb(main):032:0> a = .A.new
=> #
irb(main):033:0> a.foo :a
=> ":a"
irb(main):034:0> a.foo 1
=> "Fixnum 1"
irb(main):035:0> a.foo 1.33
=> "Numeric 1.33"


Links for this episode

HomePage of multimethod

Tags : multimethod

Download (12.4 MB, 4:54)
Alternative download for iPod and iPhone (6.6 MB, 4:54)
Powered by Olark