Je suis nouveau dans ruby et j'essaie actuellement d'opérer sur chaque caractère séparément d'une chaîne de base en 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 non définie ʻeach_char '.
Je m'attendais à voir une sortie verticale de:
A
B
C
D
..etc
La each_char
méthode est-elle définie uniquement pour 1.9? J'ai essayé d'utiliser la each
méthode simple , mais le bloc sort simplement la chaîne entière en une seule ligne. La seule façon de comprendre comment faire cela, ce qui est plutôt gênant, est de créer un tableau de caractères dès le début:
['A','B','C','D','...'].each do|i|
puts i
end
Cela produit le désiré:
A
B
C
..etc
Existe-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);
}
Réponses:
J'ai le même problème. Je recourt généralement à
String#split
:"ABCDEFG".split("").each do |i| puts i end
Je suppose que vous pouvez également l'implémenter vous-même comme ceci:
class String def each_char self.split("").each { |i| yield i } end end
Edit: encore une autre alternative est
String#each_byte
, disponible dans Ruby 1.8.6, qui renvoie la valeur ASCII de chaque caractère dans une chaîne ASCII:"ABCDEFG".each_byte do |i| puts i.chr # Fixnum#chr converts any number to the ASCII char it represents end
la source
Extension du commentaire de la_f0ka, esp. si vous avez également besoin de la position d'index dans votre code, vous devriez pouvoir 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 .la source
0..s.length - 1
=0...s.length
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 ajouter ceci:
requre 'jcode'
la source
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"]]
la source
"ABCDEFG".chars.each do |char| puts char end
aussi
"ABCDEFG".each_char {|char| p char}
Version Ruby> 2.5.1
la source