Robert Dober
4/23/2007 9:03:00 PM
On 4/23/07, Michael W. Ryder <_mwryder@worldnet.att.net> wrote:
> Brian Candler wrote:
> > On Tue, Apr 24, 2007 at 02:40:09AM +0900, Michael W. Ryder wrote:
> >> I guess my point was that str[i] behaves totally different from all the
> >> other implementations of []. All of the others return a string.
> >
> > You clearly know a lot of languages then :-)
> >
>
> I probably should have phrased that differently. What I meant that all
> of the other implementations of [] in Ruby for the String class return a
> string, only str[i] returns a number.
I copy that, you have made a somehow valid point, that has been
discussed before and do not like either that "ab"[0] == ?a (instead
of "a"). But it is not a clearcut error either.
The overloading (in human terms not computer science terms) of [] to
get elements and substrings of a string might not be the best choice
either. And that there is String#each_byte and not
String#each_character might hurt too.
But there are other tools around that make up for it.
>
> > As pointed out before, in C, str[i] is an expression whose value is an
> > integer for the character at position i, exactly as in Ruby.
> >
> > In Perl, it doesn't do what you expect either:
> >
> > $ perl -e '$a = "abcde"; print $a[2], "\n";'
> >
> > $
> >
> > (what this actually does is extract an element from the array @a, which I
> > have not initialised, and is completely unrelated to the scalar $a)
> >
> >> In Business Basic or C if I want the numeric value of a character in a
> >> string I specify that. Likewise if I want to copy a string from an
> >> arbitrary position I don't have to specify an ending character like
> >> Ruby. I just find s = t[i, -1] to be much harder to understand in a
> >> quick read then s = t[i]. Others may not have this problem.
> >
I guess that the influence of *Basic and C* to Ruby are minimal. In
order to convince a rubyist that other features might be nice because
they are present in language X, I'd rather chose X from Python, Lisp,
Smalltalk, Self, IO or Lua (and I am leaving out some by laziness and
ignorance)
> > Personally I would be *very* surprised if str[i] returned all the characters
> > from 'i' to the end of the string. But then I don't program in Business
> > Basic.
> >
> Business Basic has been doing this for over the 25 years I have been
> programming in it. For example if I enter: A$="abcdefg" and then say:
> Print A$(3) it prints cdefg. Like Ruby, if I enter B$=A$(3,3) B$
> contains cde. Other than the beginning number of the string they act
> the same.
>
> > I do program in C though. If I wanted the string from position i to the end
> > of the string, I would write str + i, or possibly &str[i]
> >
>
> But you do not have to provide a length or ending position for the copy
> which was part of my confusion. I specify a starting position and the
> language copies the rest of the string. In Ruby just providing a
> starting position gives me a numeric value.
Well if you want to get the maximum from Ruby I'd advice you, sorry if
this is sounding blunt, to take a break from too much comparing with
other languages.
Paradigm shifts are tough, after that break you might still think that
"ab"[0] == ?a is
not a good thing, but I am sure that you will be able to bring your
point across much better.
Sorry if I became lecturing, just thought it might help, after all ;).
I remember very well when I was lectured about duck typing, first I
was angry, and I said lots of stupid things (they were very clever in
my Ada world of course), but when I let go and looked at things as
they were I really shifted into the paradigm of Ruby, and yes I still
get bitten by duck typing and no I do not introduce type checking, I
just write better tests.
Welcome to Ruby.
Cheers
Robert
--
You see things; and you say Why?
But I dream things that never were; and I say Why not?
-- George Bernard Shaw