2010-10-18 3 views
16

Ho scritto una piccola applicazione rapida che prende un file di codice di base con alcune parole chiave, un file di sostituzioni per le parole chiave e genera un nuovo file con le parole chiave sostituite.Ruby 1.9 Array.to_s si comporta diversamente?

Quando stavo usando Ruby 1.8, le mie uscite sarebbero andate bene. Ora, quando si utilizza Ruby 1.9, il mio codice sostituito ha i caratteri di nuova riga al suo posto invece dei feed di riga.

Per esempio, vedo qualcosa di simile:

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

invece di:

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

io uso un hash di sostituzioni { "KEYWORD" => [ "1", "2", "3"]} e una matrice delle linee sostituite.

Io uso questo blocco per completare la sostituzione:

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 

mia impressione è che sto stampando la matrice invece delle corde all'interno dell'array. Qualsiasi suggerimento su una correzione. Quando eseguo il debug e stampo la mia stringa sostituita usando puts, l'output sembra corretto. Quando uso il metodo to_s (che è il modo in cui la mia app scrive l'output nel file di output), il mio output sembra sbagliato.

Una correzione sarebbe buona, ma quello che voglio veramente sapere è ciò che è cambiato tra Ruby 1.8 e 1.9 che causa questo comportamento. Il metodo to_s è cambiato in qualche modo in Ruby 1.9?

* io sono inesperto in Ruby

+0

codice di esempio sarebbe bello – orip

+0

ho aggiunto il codice sorgente che spero è rilevante. – jrsconfitto

+0

+1. Sto usando Ruby 1.8 e 1.9 un bel po ', ma non ho mai saputo di questa differenza! –

risposta

29

Sì, si sta chiamando to_s su un array di stringhe. In 1.8 equivale a chiamare join, in 1.9 equivale a chiamare inspect.

Per ottenere il comportamento desiderato sia in 1.8 che in 1.9, chiamare join anziché to_s.

+0

Quando è utile 'inspect'? – chongman

+0

@ chongman Intendi per matrici su 'to_s'? Sarebbe utile nel caso in cui la cosa che stai cercando di ispezionare non sia una matrice dopo tutto. Anche l'uso di 'p' /' inspect' per ispezionare gli array è solo più chiaro e coerente dal momento che è quello che si usa per ispezionare altri valori. – sepp2k

+0

Grazie. Mi rendo conto che la mia confusione era un problema 1.8.6 (?) Vs 1.9. Un tutorial mostrava "The Cat In Hat" .to_a 'e quindi ho assunto' to_s 'dovrebbe restituire la stringa originale, che credo faccia nel 1.8.6. In 1.9, to_a viene eliminato come metodo per le stringhe. 'split ("")' e 'join' sono le inverse. – chongman

3

Si prega di vedere here, sotto 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"