2009-09-28 5 views
72

Soy nuevo en ruby ​​y actualmente trato de operar en cada personaje por separado de una Cadena base en rubí. Estoy usando ruby ​​1.8.6 y me gustaría hacer algo como:iterando sobre cada carácter de una Cadena en ruby ​​1.8.6 (each_char)

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

Esto produce un método no definido `each_char' error.

Yo estaba esperando a ver una salida vertical de:

A 
B 
C 
D 
..etc 

Es el método each_char definida sólo para 1.9? Intenté usar el método simple each, pero el bloque simplemente saca toda la cadena en una línea. La única manera de calculo cómo hacer esto, que es bastante inconveniente es crear una matriz de caracteres desde el principio:

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

Esto da salida a la deseada:

A 
B 
C 
..etc 

¿Existe tal vez una manera de lograr esta salida utilizando una cadena sin modificar para empezar?

creo que el equivalente Java es:

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

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

Respuesta

103

que tienen el mismo problema. Me suelen recurrir a String#split:

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

supongo que también se puede aplicar por sí mismo de esta manera:

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

Editar: otra alternativa es String#each_byte, disponible en Ruby 1.8.6, que devuelve el valor ASCII de cada carácter en una cadena ASCII:

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

Gracias por el consejo útil. Funciona bien. Entonces, ¿para qué se utiliza el método each_char? Solo para la versión más nueva, supongo. – denchr

+0

No lo he investigado hasta ahora, pero después de buscar en Google un poco, aparentemente está listado erróneamente en los documentos 1.8.6 pero no está disponible hasta 1.8.7. –

+0

El método each_char es para la versión * anterior *, que de otro modo no lo tiene. Aún no está documentado en http://ruby-doc.org/core/classes/String.html # M000862 y para mi sorpresa, veo que each_char produce una cadena, como la división de jeremy. –

1

existe realmente un problema en 1. 8.6. y que está bien después de esta edición

en el punto 1.8.6, se puede añadir lo siguiente:

requre 'jcode' 
+0

No lo sabía, ¡gracias! +1 –

1

Pero ahora se puede hacer mucho más:

a = "cruel world" 

a.scan(/\w+/)  #=> ["cruel", "world"] 

a.scan(/.../)  #=> ["cru", "el ", "wor"] 

a.scan(/(...)/)  #=> [["cru"], ["el "], ["wor"]] 

a.scan(/(..)(..)/) #=> [["cr", "ue"], ["l ", "wo"]] 
Cuestiones relacionadas