2009-09-28 11 views
72

Sono nuovo di ruby ​​e attualmente sto cercando di operare su ciascun carattere separatamente da una stringa di base in rubino. Sto usando rubino 1.8.6 e vorrei fare qualcosa di simile:iterazione su ogni carattere di una stringa in ruby ​​1.8.6 (each_char)

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

Questo produce un metodo non definito `each_char' errore.

mi aspettavo di vedere un'uscita verticale:

A 
B 
C 
D 
..etc 

è il metodo each_char definita solo per 1.9? Ho provato ad utilizzare il metodo semplice each, ma il blocco semplicemente rilascia l'intera stringa in una riga. L'unico modo immagino come fare questo, che è piuttosto scomodo è quello di creare un array di caratteri fin dall'inizio:

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

Questo produce il desiderato:

A 
B 
C 
..etc 

Esiste forse un modo per ottenere questo risultato utilizzando una stringa non modificata per iniziare?

penso che l'equivalente Java è:

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

"asfds" .char.each .... –

risposta

103

Ho lo stesso problema. Io di solito ricorrere a String#split:

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

Credo che si potrebbe anche implementare voi stessi in questo modo:

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

Edit: ancora un'altra alternativa è String#each_byte, disponibili 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 
+0

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

+0

Non l'ho ancora esaminato, ma dopo aver fatto un po 'googling, apparentemente è elencato per errore nei documenti 1.8.6 ma non è disponibile fino al 1.8.7. –

+0

Il metodo each_char è per la * older * versione, che altrimenti non ha. Non ancora documentato su http://ruby-doc.org/core/classes/String.html # M000862 e con mia sorpresa, vedo che each_char produce una stringa, come la divisione di jeremy. –

1

c'è davvero un problema in 1. 8.6. ed è ok dopo questa edizione

in 1.8.6, è possibile aggiungere questo:

requre 'jcode' 
+0

Non lo sapevo - grazie! +1 –

1

Ma ora si può 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"]] 
Problemi correlati