92 votes

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

Je suis novice en ruby et j'essaie actuellement d'opérer sur chaque caractère séparément à partir d'une chaîne de base en ruby. J'utilise ruby 1.8.6 et je voudrais 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

Est-ce que le each_char définie uniquement pour la version 1.9 ? J'ai essayé d'utiliser la méthode simple each mais le bloc édite simplement la chaîne entière sur une seule ligne. La seule façon que j'ai trouvée pour faire cela, qui est assez peu pratique, est de créer un tableau de caractères depuis le début :

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

Cela produit le résultat souhaité :

A
B
C
..etc

Existe-t-il un moyen d'obtenir ce résultat 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);
}

1 votes

"asfds".char.each....

122voto

Jeremy Ruten Points 59989

J'ai le même problème. J'ai généralement recours à String#split :

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

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

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

Edit : une autre alternative encore String#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

0 votes

Merci pour ce conseil utile. Cela fonctionne bien. A quoi sert donc la méthode each_char ? Juste pour la nouvelle version, je suppose ?

0 votes

Je ne m'étais pas penché sur la question jusqu'à présent, mais après avoir fait quelques recherches sur Google, il semble qu'elle soit mentionnée par erreur dans la documentation de la version 1.8.6, mais qu'elle ne soit pas disponible avant la version 1.8.7.

0 votes

La méthode each_char est destinée au plus vieux qui ne l'a pas autrement. Pas encore documenté à ruby-doc.org/core/classes/String.html#M000862 et à ma grande surprise, je vois que each_char donne une chaîne de caractères, comme le split de Jeremy.

17voto

sschuberth Points 3073

En prolongeant le commentaire de la_f0ka, en particulier si vous avez également besoin de la position de l'indice dans votre code, vous devriez être en mesure de faire ce qui suit

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

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

5 votes

0..s.length - 1 = 0...s.length

0 votes

Merci @MatthewRock, changé.

8voto

Julian Points 93
"ABCDEFG".chars.each do |char|
  puts char
end

également

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

Version de Ruby >2.5.1

1voto

Georgii Points 45

Renvoie un tableau de caractères dans str. C'est un raccourci pour str.each_char.to_a. Si un bloc est donné, ce qui est une forme dépréciée, fonctionne de la même manière que each_char.

de ruby-doc.org

vous pouvez aussi maintenant utiliser string.chars

1voto

kaka2008 Points 103

Il y a vraiment un problème dans la 1.8.6. et c'est ok après cette édition

dans la version 1.8.6, vous pouvez ajouter ceci :

requre 'jcode'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X