[#3986] Re: Principle of least effort -- another Ruby virtue. — Andrew Hunt <andy@...>

> Principle of Least Effort.

14 messages 2000/07/14

[#4043] What are you using Ruby for? — Dave Thomas <Dave@...>

16 messages 2000/07/16

[#4139] Facilitating Ruby self-propagation with the rig-it autopolymorph application. — Conrad Schneiker <schneik@...>

Hi,

11 messages 2000/07/20

[ruby-talk:04004] Re: Array.uniq! returning nil

From: Aleksi Niemel<aleksi.niemela@...>
Date: 2000-07-14 10:45:51 UTC
List: ruby-talk #4004
Jo asks:
> |But I don't understand your decision to _not_ follow Scheme tradition

Matz responds: 
> The reason is, as a totally object-oriented language, Ruby has too
> many operations with side-effect.  If I choose Scheme way of bang
> usage, Ruby programs are filled with bangs.  That is ugly, at least
> not my taste.  That's why.

I like your view here! I think you're quite correct. First bang-methods were
new to me and I wanted to have them used consistently. Then I realised it
would cause the programs to be stabbed all over with these ugly attention
collectors. One would lose the interest to be alerted with '!' anymore. 

Then I understood that most of methods *are* self-modifying by nature, and
it's quite apparent when named well: array.delete_at(index) says it clearly.
So we really don't need bang-methods all over. Even if it's inconsistent
from a smalltalk point of view, it's consistent with other principle. 

That principle is to tag '!' to the method with self-modifying nature if
there's a counterpart method with the same basic semantics (function) but
without self-modifying nature.

Example case could be Array#reverse and reverse!, which function is easy to
guess and it works exactly in same way, just the object it operates upon is
different (in Array#reverse case it's the object returned by receiver.dup,
not the receiver itself).

Jo continues:
> |here? After all it's understandable, and it's easy to remember. 

This principle is understandable and easy to remember too.

But here's the catch. Ruby does not follow this principle all the time.

Array#uniq and Array#uniq! are mostly same but differ in possible returning
value types. The difference should be only that Array#uniq is
array.dup.uniq!, but actually it's more than that. Array#uniq can't return
nil, but Array#uniq! can. So the caller side have to be specifically adapted
to the used version. One can say:

  array=[1,2,3].uniq    # array refers to Array object [1,2,3]

but can't say

  array=[1,2,3].uniq!   # array refers to nil

and expect to have an array which refers always to an object which class is
Array.

Matz says:
> Hope this explains what I feel.

This explains a lot. Thank you. Now I can see how clear your thinking has
been here (too :).

Still I don't know if the fact that method! can return nil was just
introduced when needed (as someone pulled in some code to show it in this
thread), and the current functionality remains because there's loads of code
relying on it, or whether it was thought, and decided, to be inconsistent
with the principle I just phrased. (Perhaps because Ruby is following here
some other clean and simple priciple.)

	- Aleksi

In This Thread

Prev Next