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 :)