pongba
9/3/2007 1:36:00 AM
On Sep 3, 12:26 am, Robert Klemme <shortcut...@googlemail.com> wrote:
> 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
Sorry, I meant 'what if' :-)
There're lots of ways to implement them, among which the more
automatic one is the StrongType module. But they all rely on explicit
dynamic type-switch, which isn't as clear as the "traditional"
overloading mechanism(i.e. draw(Matrix); draw(Graph); ).
I don't whether there're other problem related to this approach since
I'm a ruby-newbie.