ітерація над кожним символом рядка в ruby ​​1.8.6 (each_char)


86

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

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

Це спричиняє невизначений метод `кожний_чар 'помилка.

Я очікував побачити вертикальний вихід:

A
B
C
D
..etc

Чи each_charметод визначений лише для 1.9? Я спробував використати eachметод plain , але блок просто виводить весь рядок в один рядок. Єдиний спосіб зрозуміти, як це зробити, що досить незручно - це створити масив символів з самого початку:

['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

Я не вивчав це дотепер, але трохи погугливши, мабуть, це помилково вказано в документації 1.8.6, але недоступне до 1.8.7.
Jeremy Ruten

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

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

Дякую @MatthewRock, змінено.
sschuberth

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.