Reputation: 89953
In Ruby, trying to print out the individual elements of a String is giving me trouble. Instead of seeing each character, I'm seeing their ASCII values instead:
>> a = "0123"
=> "0123"
>> a[0]
=> 48
I've looked online but can't find any way to get the original "0" back out of it. I'm a little new to Ruby to I know it has to be something simple but I just can't seem to find it.
Upvotes: 17
Views: 12466
Reputation: 304493
I think each_char
or chars
describes better what you want.
irb(main):001:0> a = "0123"
=> "0123"
irb(main):002:0> Array(a.each_char)
=> ["0", "1", "2", "3"]
irb(main):003:0> puts Array(a.each_char)
0
1
2
3
=> nil
Upvotes: 0
Reputation: 2338
To summarize:
This behavior will be going away in version 1.9, in which the character itself is returned, but in previous versions, trying to reference a single character of a string by its character position will return its character value (so "ABC"[2] returns 67)
There are a number of methods that return a range of characters from a string (see the Ruby docs on the String slice method) All of the following return "C":
"ABC"[2,1]
"ABC"[2..2]
"ABC".slice(2,1)
I find the range selector to be the easiest to read. Can anyone speak to whether it is less efficient?
Upvotes: 5
Reputation: 4590
The [,] operator returns a string back to you, it is a substring operator, where as the [] operator returns the character which ruby treats as a number when printing it out.
Upvotes: 2
Reputation: 2876
Or you can convert the integer to its character value:
a[0].chr
Upvotes: 15
Reputation: 59428
That's just how [] and [,] are defined for the String class.
Check out the String API.
Upvotes: 1
Reputation: 323
I believe this is changing in Ruby 1.9 such that "asdf"[2] yields "d" rather than the character code
Upvotes: 6