Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>You could try some meta programming to reach your target.</p> <p>See the following code:</p> <pre><code>class OverloadError &lt; ArgumentError; end class Class =begin rdoc =end def define_overload_method( methodname, *methods ) methods.each{ | proc | define_method("#{methodname}_#{proc.arity}".to_sym, &amp;proc ) } define_method(methodname){|*x| if respond_to?("#{methodname}_#{x.size}") send "#{methodname}_#{x.size}", *x else raise OverloadError, "#{methodname} not defined for #{x.size} parameters" end } end end class X define_overload_method :ometh, Proc.new{ "Called me with no parameter" }, Proc.new{ |p1| "Called me with one parameter (#{p1.inspect})" }, Proc.new{ |p1,p2| "Called me with two parameter (#{p1.inspect}, #{p2.inspect})" } end x = X.new p '----------' p x.ometh() p x.ometh(1) p x.ometh(1,2) p x.ometh(1,2,3) #OverloadError </code></pre> <p>You can define your overloaded method with <code>define_overload_method</code>. Parameters are the method name and a list of procedures. The method <code>methodname</code> is created and calls the corresponding method. Which method is determined by the number of parameters (Not type!).</p> <p>An alternative syntax would be:</p> <pre><code>class OverloadError &lt; ArgumentError; end class Class def def_overload( methodname) define_method(methodname){|*x| if respond_to?("#{methodname}_#{x.size}") send "#{methodname}_#{x.size}", *x else raise OverloadError, "#{methodname} not defined for #{x.size} parameters" end } end def overload_method( methodname, proc ) define_method("#{methodname}_#{proc.arity}".to_sym, &amp;proc ) end end class X def_overload :ometh overload_method :ometh, Proc.new{ "Called me with no parameter" } overload_method :ometh, Proc.new{ |p1| "Called me with one parameter (#{p1.inspect})" } overload_method :ometh, Proc.new{ |p1,p2| "Called me with two parameter (#{p1.inspect}, #{p2.inspect})" } end </code></pre> <p><code>def_overload</code> defines the frame for your overloaded methods, <code>overload_method</code> defines one 'overload-method'.</p> <p>But as already <a href="https://stackoverflow.com/questions/10156919/overload-in-ruby#comment13028158_10156919">mentioned by Holger</a>:</p> <blockquote> <p>You should try to adapt to the Ruby way. There is a reason why there is no overloading in Ruby. Methods should only do one thing, not magically decide to do vastly different things just because of different arguments. Instead try to take advantage of Duck Typing and if in doubt, use different methods with meaningful names. </p> </blockquote> <hr> <p>I was curious how I could implement a version with type sensitive overloading. Here it is:</p> <pre><code>class OverloadError &lt; ArgumentError; end class Class def def_overload( methodname) define_method(methodname){|*x| methname = "xxx" methname = "#{methodname}_#{x.size}#{x.map{|p| p.class.to_s}.join('_')}" if respond_to?(methname) send methname, *x elsif respond_to?("#{methodname}_#{x.size}") send "#{methodname}_#{x.size}", *x else raise OverloadError, "#{methodname} not defined for #{x.size} parameters" end } end def overload_method( methodname, *args, &amp;proc ) types = [] args.each{|arg| types &lt;&lt; arg.to_s} define_method("#{methodname}_#{proc.arity}#{types.join('_')}".to_sym, &amp;proc ) end end class X def_overload :ometh overload_method(:ometh){ "Called me with no parameter" } overload_method(:ometh, String ){ |p1| "Called me with one string parameter (#{p1.inspect})" } overload_method(:ometh ){ |p1| "Called me with one parameter (#{p1.inspect})" } overload_method(:ometh){ |p1,p2| "Called me with two parameter (#{p1.inspect}, #{p2.inspect})" } end </code></pre> <p>When you call it with</p> <pre><code>p x.ometh(1) p x.ometh('a') </code></pre> <p>You get</p> <pre><code> "Called me with one parameter (1)" "Called me with one string parameter (\"a\")" </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload