Iterieren über jedes Zeichen eines Strings in Ruby 1.8.6 (each_char)

86

Ich bin neu in Ruby und versuche derzeit, jedes Zeichen separat von einem Basis-String in Ruby zu bearbeiten. Ich benutze Ruby 1.8.6 und möchte etwas tun wie:

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

Dies erzeugt einen undefinierten Methodenfehler "each_char".

Ich hatte erwartet, eine vertikale Ausgabe von zu sehen:

A
B
C
D
..etc

Ist die each_charMethode nur für 1.9 definiert? Ich habe versucht, die einfache eachMethode zu verwenden, aber der Block gibt einfach die gesamte Zeichenfolge in einer Zeile aus. Der einzige Weg, wie ich das mache, was ziemlich unpraktisch ist, besteht darin, von Anfang an eine Reihe von Zeichen zu erstellen:

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

Dies gibt das gewünschte aus:

A
B
C
..etc

Gibt es vielleicht eine Möglichkeit, diese Ausgabe zunächst mit einer unveränderten Zeichenfolge zu erreichen?

Ich denke, das Java-Äquivalent ist:

for (int i = 0; i < aString.length(); i++){
  char currentChar = aString.charAt(i);
  System.out.println(currentChar);
}
denchr
quelle
1
"asfds" .char.each ....
Muhammad Umer

Antworten:

115

Ich habe das gleiche Problem. Normalerweise greife ich auf Folgendes zurück String#split:

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

Ich denke, Sie könnten es auch selbst so implementieren:

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

Bearbeiten: Eine weitere Alternative ist String#each_bytein Ruby 1.8.6 verfügbar, die den ASCII-Wert jedes Zeichens in einer ASCII-Zeichenfolge zurückgibt:

"ABCDEFG".each_byte do |i|
  puts i.chr # Fixnum#chr converts any number to the ASCII char it represents
end
Jeremy Ruten
quelle
Danke für den hilfreichen Tipp. Es funktioniert gut. Wofür wird die each_char-Methode verwendet? Nur für die neuere Version, nehme ich an?
denchr
Ich habe es bis jetzt nicht untersucht, aber nachdem ich ein bisschen gegoogelt habe, ist es anscheinend fälschlicherweise in den 1.8.6-Dokumenten aufgeführt, aber erst in 1.8.7 verfügbar.
Jeremy Ruten
Die each_char-Methode ist für die ältere Version, die sie sonst nicht hat. Noch nicht dokumentiert unter ruby-doc.org/core/classes/String.html#M000862 und zu meiner Überraschung sehe ich, dass each_char einen String ergibt, wie Jeremy's Split.
Martin Dorey
15

Erweiterung des Kommentars von la_f0ka, insb. Wenn Sie auch die Indexposition in Ihrem Code benötigen, sollten Sie dies tun können

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

Dies .christ wichtig, da Ruby <1.9 den Code des Zeichens an dieser Position anstelle einer Teilzeichenfolge eines Zeichens an dieser Position zurückgibt .

sschuberth
quelle
5
0..s.length - 1=0...s.length
MatthewRock
Danke @MatthewRock, geändert.
Sschuberth
1

In 1.8.6 gibt es wirklich ein Problem. und es ist ok nach dieser Ausgabe

In 1.8.6 können Sie Folgendes hinzufügen:

requre 'jcode'
kaka2008
quelle
1

Aber jetzt können Sie noch viel mehr tun:

a = "cruel world"

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

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

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

a.scan(/(..)(..)/)   #=> [["cr", "ue"], ["l ", "wo"]]
GB
quelle
1
"ABCDEFG".chars.each do |char|
  puts char
end

ebenfalls

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

Ruby-Version> 2.5.1

julianisch
quelle