итерация по каждому символу строки в ruby 1.8.6 (каждый символ)


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

4 ответа:

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

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

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

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

Edit: еще одна альтернатива 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, esp. если вам также нужна позиция индекса в вашем коде, вы должны быть в состоянии сделать

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

The .chr важно как Ruby возвращает код символа в этой позиции вместо подстроки из одного символа в этой позиции.

в 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"]]