On 15 Nov 2009, at 13:30, Marnen Laibow-Koser wrote:
that may or may not represent what they do during their lifetimes.
In other words, you’re advocating writing Ruby rather like JavaScript.
That makes some sense – although, as a devil’s advocate, I could ask
why, in that case, Matz didn’t design the language with a prototype
model.
RubyQuiz #214 involved implementing Ruby for prototype inheritance. Of
the four solutions provided the longest is Matthias R.'s which
is just 33 lines of code, so prototype inheritance is hardly a complex
addition to the language ![]()
I think the main point from this whole discussion is that Ruby is an
object-oriented language, not a class-oriented or a type-oriented one.
Duck typing can feel a little transgressive at first because we’ve
been brainwashed for decades that programming is all about
categorisation and type-safety, a mathematical endeavour. But nearly
all real-world problems display a messiness and inexactitude which
either make the use of type as the core criterion of design fragile
and/or overly verbose: fragile because it isn’t always obvious where
the boundaries of a given type are drawn, and verbose because an
apparently simple composite type may involve the definition of many
hundreds of more specialised types and the coordination of their
interactions.
Duck typing works well for the very same reason that when I read a
book and it has a sentence such as “John kicks the ball” the only
information I need about John is whether or not he can kick, and the
only information I need about the ball is how it responds to being
kicked. Now there’s still a lot of information contained in this
scenario but the laziness of the evaluation means that most of the
supposed value that type can bring to bear on the problem can be
achieved with much less effort.
Or put another way, mathematics is rarely a good user interface for
design even though it’s an excellent one for analysis and decomposition.
Ellie
Eleanor McHugh
Games With Brains
http://slides.games-with-brains.net
raise ArgumentError unless @reality.responds_to? :reason