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

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

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


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'

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

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

aussi

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

Version Ruby> 2.5.1

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.