itérer sur chaque caractère d’une chaîne dans ruby ​​1.8.6 (each_char)

Je suis nouveau à Ruby et essaye actuellement d’opérer sur chaque caractère séparément d’une chaîne de base dans Ruby. J’utilise Ruby 1.8.6 et j’aimerais faire quelque chose comme:

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

Cela produit une erreur de méthode indéfinie «each_char».

Je m’attendais à voir une sortie verticale de:

 A B C D ..etc 

La méthode each_char est- each_char définie uniquement pour 1.9? J’ai essayé d’utiliser la méthode plain each méthode, mais le bloc génère simplement la chaîne entière dans une ligne. La seule façon de comprendre comment faire, ce qui est plutôt gênant, est de créer un tableau de caractères dès le départ:

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

Cela génère le désiré:

 A B C ..etc 

Y a-t-il peut-être un moyen d’obtenir cette sortie en utilisant une chaîne non modifiée pour commencer?

Je pense que l’équivalent Java est:

 for (int i = 0; i < aString.length(); i++){ char currentChar = aString.charAt(i); System.out.println(currentChar); } 

J’ai le même problème. Je recourt généralement à Ssortingng#split :

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

Je suppose que vous pourriez aussi l’implémenter vous-même comme ceci:

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

Edit: une autre alternative est Ssortingng#each_byte , disponible dans Ruby 1.8.6, qui renvoie la valeur ASCII de chaque caractère d’une chaîne ASCII:

 "ABCDEFG".each_byte do |i| puts i.chr # Fixnum#chr converts any number to the ASCII char it represents end 

Extension du commentaire de la_f0ka, esp. si vous avez également besoin de la position d’index dans votre code, vous devriez pouvoir le faire

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

Le .chr est important car Ruby <1.9 renvoie le code du caractère à cette position au lieu d' une sous-chaîne d'un caractère à cette position .

il y a vraiment un problème dans 1.8.6. et c’est ok après cette édition

dans 1.8.6, vous pouvez append ceci:

 requre 'jcode' 

Mais maintenant vous pouvez faire beaucoup plus:

 a = "cruel world" a.scan(/\w+/) #=> ["cruel", "world"] a.scan(/.../) #=> ["cru", "el ", "wor"] a.scan(/(...)/) #=> [["cru"], ["el "], ["wor"]] a.scan(/(..)(..)/) #=> [["cr", "ue"], ["l ", "wo"]]