2010-10-18 3 views
16

Ich schrieb eine schnelle kleine Anwendung, die eine Basisdatei des Codes mit einigen Schlüsselwörtern, eine Datei der Ersetzungen für die Schlüsselwörter nimmt und eine neue Datei mit den Schlüsselwörtern ausgibt, die ersetzt werden.Ruby 1.9 Array.to_s verhält sich anders?

Wenn ich Ruby 1.8 verwendete, würden meine Ausgaben gut aussehen. Bei der Verwendung von Ruby 1.9 enthält mein ersetzter Code Zeilenumbrüche anstelle von Zeilenvorschüben.

Zum Beispiel, ich sehe so etwas wie:

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

statt:

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

i ein Hash Ersatz verwenden { "STICHWORT" => [ "1", "2", "3"]} und ein Array der ersetzten Linien.

ich verwende diesen Block den Ersatz zu beenden:

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 

Meine Vermutung ist, dass ich das Array Ausdrucken bin anstelle der Saiten innerhalb des Arrays. Irgendwelche Vorschläge für eine Lösung. Wenn ich meine ersetzte Zeichenfolge mit Puts debugge und drucke, sieht die Ausgabe korrekt aus. Wenn ich die Methode to_s verwende (so schreibt meine App die Ausgabe in die Ausgabedatei), sieht meine Ausgabe falsch aus.

Ein Update wäre nett, aber was ich wirklich wissen möchte, ist, was sich zwischen Ruby 1.8 und 1.9 geändert hat, die dieses Verhalten verursacht. Hat sich die to_s-Methode in Ruby 1.9 irgendwie geändert?

* ich bin unerfahren in Ruby

+0

Codebeispiel schön – orip

+0

i den Quellcode hinzugefügt werden würde, dass ich relevant hoffen. – jrsconfitto

+0

+1. Ich habe Ruby 1.8 und 1.9 ziemlich oft benutzt, wusste aber nie über diesen Unterschied! –

Antwort

29

Ja, Sie anrufen to_s auf einem Array von Strings. In 1.8 entspricht das dem Aufruf join, in 1.9 entspricht es dem Aufruf inspect.

Um das gewünschte Verhalten in 1.8 und 1.9 zu erhalten, rufen Sie join statt to_s.

+0

Wann ist "inspect" nützlich? – chongman

+0

@chongman Sie meinen für Arrays über 'to_s'? Es wäre nützlich, wenn das Ding, das Sie zu inspizieren versuchen, nicht doch ein Array ist. Auch die Verwendung von 'p' /' inspect' zur Überprüfung von Arrays ist nur klarer und konsistenter, da dies zur Überprüfung anderer Werte verwendet wird. – sepp2k

+0

Danke. Ich merke, meine Verwirrung war eine 1,8,6 (?) Vs 1,9 Problem. Ein Tutorial zeigte '' The Cat In Hat '.to_a' und dann nahm ich an 'to_s' sollte die ursprüngliche Saite zurückgeben, was ich glaube, dass es in 1.8.6 funktioniert. In 1.9 wird to_a als Methode für Strings eliminiert. 'Split ("")' und 'Join' sind die Inversen. – chongman

3

Bitte beachten Sie here unter 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"