On 28 Feb 2000, Quinn Dunkan wrote: > > Comments by yashi and gotoken: > > > > Characters are integers in ruby. > > > 'hello'[0] -> 104 > > > > no, there is only String class. all char is an instance of class > > String. And, [] is a method in class String to get _char code_. > > Ok, so it would have been more accurate to say: > Indexing a string in ruby gives you an Integer. > > I'm still not clear on why this is the case, or how it's useful. A few other > languages: > python: string[0] -> StringType > C: stringp[0] -> char > haskell: string !! 0 -> Char > smalltalk: string at: 1 -> Character > In perl, strings are not sequences and can't be indexed, so you have to use > substr, which gives a string. > ruby: string[0] -> Fixnum > > The other languages approaches seem more intuitive. > I agree, i have found Ruby's approach on this a bit strange. Coming mainly from Python, i was surprised to get 'hello'[0] == 'h' # => false and to have to write one of the following 'hello'[0].chr == 'h' # => true 'hello'[0,1] == 'h' # => true 'hello'[0] == ?h # => true ("?h" is the ASCII code notation, explained under "Numeric Literals" in the Reference Manual.) I'm getting used to it, but i still prefer Python's approach. When i index a string, or iterate over a string, i usually want a 1-sized string, and not a number. Maybe we still see things from a Pythonic perspective. Anyway, this is a point to stress in your Python to Ruby conversion guide! ;-) > For example, in the haskell prelude: > type String = [Char] -- strings are lists of characters > > So why doesn't ruby have a Char class? > What methods should a Char class provide? > > If I may add, "hello"[0].chr == "h". Note that String object is not > > always a character string, String can represent a octet (byte) string. > > Well, that's because Integers happen to respond to the chr message, it's still > an Integer ('hello'[0].type -> Fixnum). Hmm, I think String objects *are* > always character strings, I think what you mean is that they are not always > *printable* character strings :) But that's not for the language to decide, > whether or not it's printable depends on your character set, and neither has > any bearing on what [] should return. If I index a binary string, I still > wouldn't expect to get a fixnum, since if I slice 4 elements I don't get a > 32-bit int, but a string. > The String class has a each_byte method, which (from the Reference Manual) "iterates over each character of the string". So, a character and a byte seems to be the same thing. As in C, after all. Ciao. -- Mirko Nasato