Я новичок в рубине и в настоящее время пытаюсь работать с каждым символом отдельно от базовой строки в рубине. Я использую Ruby 1.8.6 и хочу сделать что-то вроде:
"ABCDEFG".each_char do |i|
puts i
end
Это приводит к ошибке неопределенного метода «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);
}
Ответы:
У меня такая же проблема. Я обычно прибегаю к
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 каждого символа в строке ASCII:"ABCDEFG".each_byte do |i| puts i.chr # Fixnum#chr converts any number to the ASCII char it represents end
источник
Расширение комментария la_f0ka, особенно. если вам также нужна позиция индекса в вашем коде, вы сможете сделать
s = 'ABCDEFG' for pos in 0...s.length puts s[pos].chr end
Это
.chr
важно, поскольку Ruby <1.9 возвращает код символа в этой позиции вместо подстроки из одного символа в этой позиции .источник
0..s.length - 1
=0...s.length
действительно проблема в 1.8.6. и это нормально после этого выпуска
в 1.8.6 вы можете добавить это:
requre 'jcode'
источник
Но теперь вы можете сделать гораздо больше:
a = "cruel world" a.scan(/\w+/) #=> ["cruel", "world"] a.scan(/.../) #=> ["cru", "el ", "wor"] a.scan(/(...)/) #=> [["cru"], ["el "], ["wor"]] a.scan(/(..)(..)/) #=> [["cr", "ue"], ["l ", "wo"]]
источник
"ABCDEFG".chars.each do |char| puts char end
также
"ABCDEFG".each_char {|char| p char}
Версия Ruby> 2.5.1
источник