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);
}

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

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


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'

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

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

ebenfalls

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

Ruby-Version> 2.5.1

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.