[#3109] Is divmod dangerous? — Dave Thomas <Dave@...>

14 messages 2000/06/06

[#3149] Retrieving the hostname and port in net/http — Roland Jesse <jesse@...>

Hi,

12 messages 2000/06/07

[#3222] Ruby coding standard? — Robert Feldt <feldt@...>

16 messages 2000/06/09

[#3277] Re: BUG or something? — Aleksi Niemel<aleksi.niemela@...>

> |I am new to Ruby and this brings up a question I have had

17 messages 2000/06/12
[#3281] Re: BUG or something? — Dave Thomas <Dave@...> 2000/06/12

Aleksi Niemel<aleksi.niemela@cinnober.com> writes:

[#3296] RE: about documentation — Aleksi Niemel<aleksi.niemela@...>

> I want to contribute to the ruby project in my spare time.

15 messages 2000/06/12

[#3407] Waffling between Python and Ruby — "Warren Postma" <embed@...>

I was looking at the Ruby editor/IDE for windows and was disappointed with

19 messages 2000/06/14

[#3410] Exercice: Translate into Ruby :-) — Jilani Khaldi <jilanik@...>

Hi All,

17 messages 2000/06/14

[#3415] Re: Waffling between Python and Ruby — Andrew Hunt <andy@...>

>Static typing..., hmm,...

11 messages 2000/06/14

[#3453] Re: Static Typing( Was: Waffling between Python and Ruby) — Andrew Hunt <andy@...>

32 messages 2000/06/16

[#3516] Deep copy? — Hugh Sasse Staff Elec Eng <hgs@...>

Given that I cannot overload =, how should I go about ensuring a deep

20 messages 2000/06/19

[#3694] Why it's quiet — hal9000@...

We are all busy learning the new language

26 messages 2000/06/29
[#3703] Re: Why it's quiet — "NAKAMURA, Hiroshi" <nahi@...> 2000/06/30

Hi,

[#3705] Re: Why it's quiet — matz@... (Yukihiro Matsumoto) 2000/06/30

Hi,

[ruby-talk:03591] Re: Interface polymorphism

From: Dave Thomas <Dave@...>
Date: 2000-06-21 19:35:48 UTC
List: ruby-talk #3591
hal9000@hypermetrics.com writes:

> For that matter, I am not sure how Ruby handles name clashes --
> i.e., names defined in more than one included module. I suppose
> you simply use the fully qualified name?

Whenever you include a module, Ruby effectively[1] inserts that module as 
a parent class of the thing that includes it. Each additional include
gets added in the same way, latest ones at the front. These methods
are placed in the chain after the object's own class, so they won't
override anything defined in the class itself.

When Ruby is searching for a method to execute, it looks back up the
class chain until it finds a match, and then executes the method. So,
last method in wins.

  module M1
    def meth
      puts "m1"
    end
  end

  module M2
    def meth
      puts "m2"
    end
  end

  class C
  end

  c = C.new
  puts defined? c.meth   #=> nil

  class C
    include M1
  end

  c.meth                #=> m1

  class C
    include M2
  end

  c.meth                #=> m2

  # there's no going back--a module is only ever included once
  class C
    include M1
  end

  c.meth                #=> m2



In general, when you're thinking about polymorphism in Ruby, you need
not be constrained by the concepts of predefining interfaces or
inheriting from hierarchies. It's a different way of working if you're 
used to C++ or Java, but it _does_ work.

Regards


Dave


Footnotes: 
[1]  Actually it inserts a proxy for the module.


In This Thread