Итерация каждого символа строки в рубине 1.8.6 (each_char)

Я новичок в ruby ​​и в настоящее время пытаюсь работать с каждым символом отдельно от базовой строки в ruby. Я использую ruby ​​1.8.6 и хотел бы сделать что-то вроде:

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

Это вызывает ошибку undefined `each_char '.

Я ожидал увидеть вертикальный вывод:

A
B
C
D
..etc

Определен ли метод each_char только для 1.9? Я попытался использовать простой метод each, но блок просто выводит всю строку в одной строке. Единственный способ, которым я рисую, как это сделать, что довольно неудобно, - создать массив символов с самого начала:

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

Выводит желаемое значение:

A
B
C
..etc

Может ли быть способ получить этот вывод с использованием немодифицированной строки для начала?

Я думаю, что эквивалент Java:

for (int i = 0; i < aString.length(); i++){
  char currentChar = aString.charAt(i);
  System.out.println(currentChar);
}

Ответ 1

У меня та же проблема. Обычно я прибегаю к String#split:

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

Я думаю, вы могли бы реализовать его сами так:

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

Изменить: еще одна альтернатива - это String#each_byte, доступная в Ruby 1.8.6, которая возвращает значение ASCII каждого char в строке ASCII:

"ABCDEFG".each_byte do |i|
  puts i.chr # Fixnum#chr converts any number to the ASCII char it represents
end

Ответ 3

действительно существует проблема в 1.8.6. и это нормально после этого издания

в 1.8.6, вы можете добавить это:

requre 'jcode'

Ответ 4

Но теперь вы можете сделать гораздо больше:

a = "cruel world"

a.scan(/\w+/)        #=> ["cruel", "world"]

a.scan(/.../)        #=> ["cru", "el ", "wor"]

a.scan(/(...)/)      #=> [["cru"], ["el "], ["wor"]]

a.scan(/(..)(..)/)   #=> [["cr", "ue"], ["l ", "wo"]]