An important point about the Ruby Programming language and multiple inheritance - while Ruby does use modules which are roughly analogous to Java's interfaces it also supports delegation as a part of its standard library of objects.

One other facet to Ruby I feel would be criminal not to mention is its fully dynamic nature. Unlike Java and some other programming languages which have comparatively static object systems classes in Ruby can be modified/augmented at any time unless they're locked (or frozen in Ruby parlance). So if you want to change the way the base String class works you can just say:


class String
  def initialize(...)
    # New way for String to behave.  Maybe implement taint
    # checking?)
  end
end

and you've just globally patched the String object. You can even do this from within a debugger to test changes to your running program.

Ruby has this concept of blocks and iterators that form the basis of many the language's looping constructs - is in many cases objects of a specific type will define their own looping behavior.

Ruby is a hacker's dream :)