On 02.09.2007 14:48, pongba wrote: > Matz once replied on Cedric's blog that > > I am not against "method overloading", but it very easily leads to > optional static typing in the language, which changes the language > very drastically, since you need to specify "type" to overload > arguments. Without well-thought design, it can "destroy" the language > and its culture. I have not yet got that well-thought design of method > overloading. > > This is a very general argument, what concerns me is that if, for > instance, we have Matrix and Graph, and we'd like to be able to draw > both of them (the two 'draw's would have the same semantic but > different implementation logic), how 're we going to be able to > overload draw on Matrix and Graph like what we do in C++ or Java: > > void draw(Matrix); > void draw(Graph); > > One might argue that 'draw' should actually be a member function of > Matrix and Graph so the problem is moot. But then there's two more > problems: > > 1. if we can't modify Matrix or Graph, and writing a non-member 'draw' > is the only thing we can do to extend the interface of them, and we > actually can write 'draw' in terms of the public interface of Matrix > and Graph. Somehow I miss something in this sentence. You write "if..." but I do not see any "then". So what exactly are you trying to say / ask here? You can usually change classes. Also, there are numerous ways to implement dispatching on argument types, for example this one: class Drawer @draw = Hash.new(lambda {|x| raise "Cannot draw #{x.inspect}"}). merge(Matrix => lambda {|x| puts "Drawing Matrix #{x.inspect}"}, Graph => lambda {|x| puts "Drawing Graph #{x.inspect}"}) def draw(obj) self.class.instance_eval {@draw}[obj.class][obj] end end irb(main):012:0> Drawer.new.draw(Matrix.new) Drawing Matrix #<Matrix:0x7ff62e38> => nil irb(main):013:0> Drawer.new.draw(Graph.new) Drawing Graph #<Graph:0x7ff5fe54> => nil irb(main):014:0> Drawer.new.draw("foo") RuntimeError: Cannot draw "foo" from (irb):4 from (irb):9:in `[]' from (irb):9:in `draw' from (irb):14 from :0 irb(main):015:0> There are others, you can find some of them in the Ruby Garden Wiki (which seems to be unavailable ATM). > 2. if '1' doesn't matter (because in ruby we actually can add new > methods to an existing class), then can you please give another more > qualified example? Example for what? Kind regards robert