David Garamond [mailto:lists@zara.6.isreserved.com]:
Sean O'Dell wrote:
That's just a confidence issue. I don't care if the object coming
in is broken. I'm not concerned about catching objects which are
implemented improperly; that's actually very rare. If an object
had a signature that said "I am a hash-like object" that would be
fine for me. Duck typing and checking respond_to? are completely
inadequate, and it seems like people argue those points because
Ruby offers nothing else and so what are you going to advocate?
It's those two or rolling your own interface identification
system, which I think is cheesy; that sort of functionality
should come from the framework.Okay, I'm trying to sum up this thread as well as test whether my
understanding of this whole typing issue in Ruby is more or
less correct.
1. Ruby _has_ types. It's called classes. In fact, all OO
languages which have a class concept (as opposed to some
classless OO languages like Self, I think) implement types
through classes. All object belong to a certain class. That
class is the object's type.
Actually, Ruby has both types and classes. Many developers confuse
types and classes because in C++ they are one and the same; in Java
they are slightly different, but not noticeably so (with the
introduction of interfaces).
An object of class Array is both an Array and an Enumerable; it also
belongs to the nebulous class of "objects-that-respond-to-#". In a
current project, I am dealing with "objects-that-respond-to-#<<".
This allows me to buffer output in a string, an array, or simply go
to an IO object.
2. However, Ruby does _not_ do type checking for you. This means,
method declaration is not like this[...]
Again, a clarificatio: Ruby does not restrict method signatures.
This is a Good Thing.
3. Ruby also does not tag a variable with type. This means, you
don't declare variable's type like this[...]
Correct. Ruby variables are untyped; objects, however, are typed. To
be quite explicit: Ruby variables don't have types at all; the
objects that they reference do.
#2 and #3 are perhaps what people miss when they move from
C++/Java to Python/Ruby. I don't know whether Ruby will ever have
#2 and #3.
I hope not, personally, as it would reduce the flexibility of the
language. Slides from last year's RubyConf, however, suggest that #2
may happen to some degree. I prefer a descriptive rather than
restrictive interface for this stuff, though.
4. Static type checking (or static typing?) is #2 and #3, done at
compile time. This is what C++ and Java do. Ruby, of course,
does not have type checking, much less static type checking.
No. Ruby does not have "class-checking" or "interface-checking"
built into the language. It does have type checking in that if an
object does not respond to a method -- or does not respond properly
-- it will cause an exception to be raised (NoMethodError,
ArgumentError).
[snip]
Points 5, 6, and 7 share other (similar) flaws. Note that Ruby's
modules *are* interfaces.
-austin
···
--
austin ziegler * austin.ziegler@evault.com