перебор каждого символа String в ruby ​​1.8.6 (each_char)


86

Я новичок в рубине и в настоящее время пытаюсь работать с каждым символом отдельно от базовой строки в рубине. Я использую 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);
}

1
"asfds" .char.each ....
Мухаммад Умер

Ответы:


115

У меня такая же проблема. Я обычно прибегаю к 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

Спасибо за полезный совет. Работает нормально. Итак, для чего используется метод each_char? Я полагаю, только для более новой версии?
denchr

Я не разбирался в этом до сих пор, но после небольшого поиска в Google, очевидно, он ошибочно указан в документации 1.8.6, но недоступен до 1.8.7.
Джереми Рутен,

Метод each_char предназначен для более старой версии, в которой он иначе отсутствует. Еще не задокументировано на ruby-doc.org/core/classes/String.html#M000862, и, к моему удивлению, я вижу, что each_char возвращает строку, как разбиение Джереми.
Мартин Дори

15

Расширение комментария la_f0ka, особенно. если вам также нужна позиция индекса в вашем коде, вы сможете сделать

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

Это .chrважно, поскольку Ruby <1.9 возвращает код символа в этой позиции вместо подстроки из одного символа в этой позиции .


5
0..s.length - 1=0...s.length
MatthewRock 01

Спасибо @MatthewRock, изменилось.
sschuberth 05

1

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

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

requre 'jcode'

1

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

a = "cruel world"

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

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

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

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

1
"ABCDEFG".chars.each do |char|
  puts char
end

также

"ABCDEFG".each_char {|char| p char}

Версия Ruby> 2.5.1

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.