iteracja nad każdym znakiem łańcucha w ruby 1.8.6 (każdy znak)

Jestem nowy w Rubim i obecnie próbuję operować na każdym znaku oddzielnie od podstawowego ciągu znaków w Rubim. Używam ruby 1.8.6 i chciałbym zrobić coś takiego:

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

Spowoduje to błąd niezdefiniowanej metody `each_char'.

Spodziewałem się zobaczyć wyjście pionowe:

A
B
C
D
..etc

Czy metoda each_char jest zdefiniowana tylko dla 1.9? Próbowałem użyć metody plain each, ale blok po prostu usuwa cały łańcuch w jednej linii. / Align = "left" / , co jest raczej niewygodne, to stworzenie tablicy znaków od początku:

['A','B','C','D','...'].each do|i|
  puts i
end

To wyprowadza pożądane:

A
B
C
..etc

Czy jest jakiś sposób na osiągnięcie tego wyniku przy użyciu niezmodyfikowanego ciągu znaków na początek?

Myślę, że odpowiednikiem Javy jest:

for (int i = 0; i < aString.length(); i++){
  char currentChar = aString.charAt(i);
  System.out.println(currentChar);
}
Author: Andrew Grimm, 2009-09-28

4 answers

Mam ten sam problem. Zwykle uciekam się do String#split:

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

Wydaje mi się, że sam mógłbyś to zaimplementować w ten sposób:

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

Edit: kolejną alternatywą jest String#each_byte, dostępna w Ruby 1.8.6, która zwraca wartość ASCII każdego znaku w łańcuchu ASCII:

"ABCDEFG".each_byte do |i|
  puts i.chr # Fixnum#chr converts any number to the ASCII char it represents
end
 106
Author: Jeremy Ruten,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-28 01:02:20

Rozszerzenie komentarza la_f0ka, esp. jeśli potrzebujesz również pozycji indeksu w swoim kodzie, powinieneś być w stanie wykonać

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

.chr jest ważne, ponieważ Ruby zwraca kod znaku na tej pozycji zamiast podłańcuch jednego znaku na tej pozycji .

 12
Author: sschuberth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-05 07:33:05

W 1.8.6 jest naprawdę problem. and it ' s ok after this edition

W 1.8.6 możesz dodać to:

requre 'jcode'
 1
Author: kaka2008,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-28 05:51:28

Ale teraz możesz zrobić znacznie więcej:

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
Author: G.B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-19 11:16:17