Итерация каждого символа строки в рубине 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
Ответ 2
Расширение комментария la_f0ka, особенно. если вам также нужна позиция индекса в вашем коде, вы должны иметь возможность делать
s = 'ABCDEFG'
for pos in 0...s.length
puts s[pos].chr
end
.chr
важен как Ruby < 1.9 возвращает код символа в этой позиции вместо подстрока одного персонажа в этой позиции.
Ответ 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"]]