2010-10-18 8 views
16

J'ai écrit une petite application rapide qui prend un fichier de base avec quelques mots-clés, un fichier de remplacements pour les mots-clés, et sort un nouveau fichier avec les mots-clés remplacés. Quand j'utilisais Ruby 1.8, mes sorties semblaient bien. Maintenant, en utilisant Ruby 1.9, mon code remplacé a les caractères de nouvelle ligne à la place des sauts de ligne.Ruby 1.9 Array.to_s se comporte différemment?

Par exemple, je vois quelque chose comme:

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

au lieu de:

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

i utilise un hachage de remplacement { "KEYWORD" => [ "1", "2", "3"]} et un tableau des lignes remplacées.

i utiliser ce bloc pour terminer le remplacement:

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 

Mon instinct me dit que je suis l'impression du tableau au lieu des chaînes dans le tableau. Toutes les suggestions sur un correctif. Quand je débogue et imprime ma chaîne remplacée en utilisant puts, la sortie semble correcte. Lorsque j'utilise la méthode to_s (qui est la façon dont mon application écrit la sortie dans le fichier de sortie), ma sortie semble incorrecte.

Une correction serait bien, mais ce que je veux vraiment savoir, c'est ce qui a changé entre Ruby 1.8 et 1.9 qui provoque ce comportement. Est-ce que la méthode to_s a changé d'une manière ou d'une autre dans Ruby 1.9?

* Je suis inexpérimenté dans Ruby

+0

exemple de code serait bien – orip

+0

i ajouté le code source qui je l'espère est pertinente. – jrsconfitto

+0

+1. J'utilise Ruby 1.8 et 1.9 un peu, mais je n'ai jamais su cette différence! –

Répondre

29

Oui, vous appelez to_s sur un tableau de chaînes. Dans 1.8 cela équivaut à appeler join, en 1.9 cela équivaut à appeler inspect.

Pour obtenir le comportement que vous souhaitez dans les deux 1.8 et 1.9, appelez join au lieu de to_s.

+0

Quand 'inspect' est-il utile? – chongman

+0

@chongman Vous voulez dire pour les tableaux sur 'to_s'? Ce serait utile au cas où la chose que vous essayez d'inspecter ne soit pas un tableau après tout. Utiliser 'p' /' inspect' pour inspecter les tableaux est aussi plus clair et plus cohérent puisque c'est ce que vous utilisez pour inspecter d'autres valeurs. – sepp2k

+0

Merci. Je me rends compte que ma confusion était un problème 1.8.6 (?) Vs 1.9. Un tutoriel a montré '' The Cat In Hat ".to_a 'et j'ai supposé que' to_s 'devrait retourner la chaîne d'origine, ce que je crois faire en 1.8.6. Dans 1.9, to_a est éliminé en tant que méthode pour les chaînes. 'split ("")' et 'join' sont les inverses. – chongman

3

S'il vous plaît voir here, sous 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" 
Questions connexes