2010-10-18 10 views
16

escribí una pequeña aplicación rápida que toma un archivo base de código con algunas palabras clave, un archivo de reemplazos para las palabras clave y genera un nuevo archivo con las palabras clave reemplazadas.Ruby 1.9 Array.to_s se comporta de manera diferente?

Cuando estaba usando Ruby 1.8, mi salida se vería bien. Ahora, cuando utilizo Ruby 1.9, mi código reemplazado tiene los caracteres de nueva línea en lugar de los feeds de línea.

Por ejemplo, veo algo como:

["\r\nDim RunningNormal_1 As Boolean", "\r\nDim RunningNormal_2 As Boolean", "\r\nDim RunningNormal_3 As Boolean"] 

en lugar de:

Dim RunningNormal_1 As Boolean 
Dim RunningNormal_2 As Boolean 
Dim RunningNormal_3 As Boolean 

i utilizar un hash de los reemplazos { "PALABRA CLAVE" => [ "1", "2", "3"]} y una matriz de las líneas reemplazadas.

Puedo usar este bloque para finalizar la sustitución:

resultingLibs.each do |x| 
    libraryString.sub!(/(<REPEAT>(.*?)<\/REPEAT>)/im) do |match| 
    x.each do |individual| 
     individual.to_s 
    end 
    end 
end 
#for each resulting group of the repeatable pattern, 
# 
#Write out the resulting libs to a combined string 

Mi corazonada es que estoy imprimiendo la matriz en lugar de las cadenas dentro de la matriz. Cualquier sugerencia sobre una solución. Cuando depuro e imprimo mi cadena reemplazada usando puts, la salida parece correcta. Cuando uso el método to_s (que es como mi aplicación escribe el resultado en el archivo de salida), mi salida se ve mal.

Una solución sería agradable, pero lo que realmente quiero saber es qué cambió entre Ruby 1.8 y 1.9 que causa este comportamiento. ¿Ha cambiado el método to_s de alguna manera en Ruby 1.9?

* I sin experiencia en Ruby

+0

código de ejemplo sería bueno – orip

+0

he añadido el código fuente que espero es relevante. – jrsconfitto

+0

+1. He estado usando Ruby 1.8 y 1.9 bastante, ¡pero nunca supe esta diferencia! –

Respuesta

29

Sí, que está llamando to_s en una matriz de cadenas. En 1.8 que es equivalente a llamar al join, en 1.9 es equivalente a llamar al inspect.

Para obtener el comportamiento que desea en 1.8 y 1.9, llame al join en lugar de to_s.

+0

¿Cuándo es 'inspeccionar' útil? – chongman

+0

@chongman ¿Quiere decir para arreglos sobre 'to_s'? Sería útil en caso de que lo que estás tratando de inspeccionar no sea una matriz después de todo. También el uso de 'p' /' inspect' para inspeccionar las matrices es más claro y más uniforme, ya que eso es lo que se usa para inspeccionar otros valores. – sepp2k

+0

Gracias. Me doy cuenta de que mi confusión fue un 1.8.6 (?) Vs 1.9 problema. Un tutorial mostró "El sombrero de gato" .a_a 'y luego asumí que' to_s 'debería devolver la cadena original, lo que creo que ocurre en 1.8.6. En 1.9, to_a se elimina como un método para cadenas. 'split ("")' y 'join' son las inversas. – chongman

3

favor ver here, bajo Array

Array#to_s is equivalent to Array#inspect 

[1,2,3,4].to_s         # => "[1, 2, 3, 4]" 

instead of 

RUBY_VERSION          # => "1.8.5" 
[1,2,3,4].to_s         # => "1234" 
Cuestiones relacionadas