iterando su ogni carattere di una stringa in ruby ​​1.8.6 (each_char)


86

Sono nuovo in Ruby e attualmente sto cercando di operare su ogni personaggio separatamente da una stringa di base in Ruby. Sto usando ruby ​​1.8.6 e vorrei fare qualcosa come:

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

Questo produce un errore di metodo indefinito "each_char ".

Mi aspettavo di vedere un output verticale di:

A
B
C
D
..etc

Il each_charmetodo è definito solo per 1.9? Ho provato a utilizzare il eachmetodo semplice , ma il blocco emette semplicemente l'intera stringa in una riga. L'unico modo in cui riesco a capire come farlo, il che è piuttosto scomodo, è creare una matrice di caratteri dall'inizio:

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

Questo produce il desiderato:

A
B
C
..etc

C'è forse un modo per ottenere questo output utilizzando una stringa non modificata per cominciare?

Penso che l'equivalente Java sia:

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

1
"asfds" .char.each ....
Muhammad Umer

Risposte:


115

Ho lo stesso problema. Di solito ricorro a String#split:

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

Immagino che potresti anche implementarlo da solo in questo modo:

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

Modifica: è ancora un'altra alternativa String#each_byte, disponibile in Ruby 1.8.6, che restituisce il valore ASCII di ogni carattere in una stringa ASCII:

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

Grazie per il suggerimento utile. Funziona bene. Allora a cosa serve il metodo each_char? Solo per la versione più recente suppongo?
denchr

Non l'ho esaminato fino ad ora, ma dopo aver cercato un po 'su Google, a quanto pare è erroneamente elencato nei documenti 1.8.6 ma non è disponibile fino alla 1.8.7.
Jeremy Ruten,

Il metodo each_char è per la versione precedente , che altrimenti non ce l'ha. Non ancora documentato su ruby-doc.org/core/classes/String.html#M000862 e con mia sorpresa, vedo che each_char restituisce una stringa, come la divisione di jeremy.
Martin Dorey


1

c'è davvero un problema nella 1.8.6. ed è ok dopo questa edizione

in 1.8.6, puoi aggiungere questo:

requre 'jcode'

1

Ma ora puoi fare molto di più:

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

anche

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

Versione Ruby> 2.5.1

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.