Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iterating over each character of a String in ruby 1.8.6 (each_char)

I am new to ruby and currently trying to operate on each character separately from a base String in ruby. I am using ruby 1.8.6 and would like to do something like:

"ABCDEFG".each_char do |i|   puts i end 

This produces a undefined method `each_char' error.

I was expecting to see a vertical output of:

A B C D ..etc 

Is the each_char method defined only for 1.9? I tried using the plain each method, but the block simply ouputs the entire string in one line. The only way I figure how to do this, which is rather inconvenient is to create an array of characters from the begining:

['A','B','C','D','...'].each do|i|   puts i end 

This outputs the desired:

A B C ..etc 

Is there perhaps a way to achive this output using an unmodified string to begin with?

I think the Java equivalent is:

for (int i = 0; i < aString.length(); i++){   char currentChar = aString.charAt(i);   System.out.println(currentChar); } 
like image 552
denchr Avatar asked Sep 28 '09 00:09

denchr


People also ask

What does Each_char do in Ruby?

The each_char in Ruby is used to pass each character that makes a string to a block in Ruby. The block of each_char takes a single parameter which represents characters in a string.

How do you repeat a character in Ruby?

Repeat a character or string N times in Ruby. In Ruby, when the * operator is used with a string on the left hand side and an integer on the right hand side (i.e. string * integer ), it repeats the string as many times as specified by the integer. For example: foo = "quack!" * 3 puts foo # output: "quack!


2 Answers

I have the same problem. I usually resort to String#split:

"ABCDEFG".split("").each do |i|   puts i end 

I guess you could also implement it yourself like this:

class String   def each_char     self.split("").each { |i| yield i }   end end 

Edit: yet another alternative is String#each_byte, available in Ruby 1.8.6, which returns the ASCII value of each char in an ASCII string:

"ABCDEFG".each_byte do |i|   puts i.chr # Fixnum#chr converts any number to the ASCII char it represents end 
like image 149
Paige Ruten Avatar answered Sep 28 '22 06:09

Paige Ruten


Extending la_f0ka's comment, esp. if you also need the index position in your code, you should be able to do

s = 'ABCDEFG' for pos in 0...s.length     puts s[pos].chr end 

The .chr is important as Ruby < 1.9 returns the code of the character at that position instead of a substring of one character at that position.

like image 21
sschuberth Avatar answered Sep 28 '22 07:09

sschuberth