On Sun, May 27, 2007 at 01:00:03AM +0900, Henrik Schmidt wrote:
> Hakusa / gmail.com wrote:
> >If a language stops you from doing something just because it's bad
> >practice, then the language is treating you like an idiot.
>
> Fine, so don't stop be. Warn me that I'm doing something which is
> probably a programmer error 99% of the time. Ruby stops me from all
> sorts of things I can do in Perl. I think that's a good thing, since I'm
> a horrible Perl programmer :)
>
> >What if I
> >wanted to override a function for a little while? I could assign it a
> >new value and use the same methods of a different class!
> >
>
> Then you'll just override it. My question is, why would you want to
> override a method with a variable? I have no problem with overloading a
> method with another method, and neither should the interpreter.
The trouble is:
(1) All objects are descendants of Object, which in turn mixes in Kernel.
Many other objects mix in Enumerable, Comparable and other modules.
This means that a typical object has roughly a googol different methods
already present, and it's very easy to pick a local variable name which
happens to collide with one. Silently ignoring this "just works". Giving an
error would be very annoying; instead of "id = 9" I'd have to change it to
"my_id = 9" or somesuch. In the end I'd prefix all local variables with
my_... which would be worse than using something perlish like "$"
(2) From a very practical perspective, it's extremely difficult for Ruby to
generate these warnings.
The problem is: Ruby is a completely dynamic language, and at parse time you
have no idea what methods an object has. The decision as to 'local variable'
or 'method' is made statically, based on inspection of the code
*before* it's executed, which means before any classes and methods have been
created.
To perform the check you're asking for, Ruby would have to add extra
run-time code after *every* local variable access to perform a method search
just to check if a method with the same name exists. Example:
10000.times do
x = flurble()
y = y + x
end
Each time round the loop, the call to flurble() may have ended up defining a
method called 'x' in the current object. So every time round the loop, you'd
have to check, at the point where 'x' was read and/or assigned, that there
was currently no method called 'x' (or 'x=') in the object.
Regards,
Brian.