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

86

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_charméthode est-elle définie uniquement pour 1.9? J'ai essayé d'utiliser la eachmé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);
}
Denchr
la source
1
"asfds" .char.each ....
Muhammad Umer

Réponses:

115

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
Jeremy Ruten
la source
Merci pour le conseil utile. Ça fonctionne bien. Alors, à quoi sert la méthode each_char? Juste pour la nouvelle version je suppose?
denchr le
Je ne l'ai pas regardé jusqu'à présent, mais après avoir un peu cherché sur Google, il est apparemment répertorié par erreur dans la documentation de la 1.8.6 mais n'est pas disponible avant le 1.8.7.
Jeremy Ruten
La méthode each_char est pour l' ancienne version, qui ne l'a pas autrement. Pas encore documenté sur ruby-doc.org/core/classes/String.html#M000862 et à ma grande surprise, je vois que each_char donne une chaîne, comme le split de jeremy.
Martin Dorey
15

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 .chrest 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 .

sschuberth
la source
5
0..s.length - 1=0...s.length
MatthewRock
Merci @MatthewRock, changé.
sschuberth
1

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'
kaka2008
la source
1

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"]]
GB
la source
1
"ABCDEFG".chars.each do |char|
  puts char
end

aussi

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

Version Ruby> 2.5.1

julien
la source