2017-02-20 1 views
0

(Crossposting Anmerkung: Diese Frage bei https://www.ruby-forum.com/topic/6879239 ohne eine Antwort zu bekommen gefragt wird bereits)Rubin: Einstellung Ausgang Separator für IO-Objekt

Aus der Dokumentation von IO # print:

„Schreibt das angegebene Objekt (s) zu ios. ... Wenn das Ausgabesatztrennzeichen ($\) nicht gleich Null ist, wird es an den Ausgang angehängt. "

Wenn ich das wörtlich nehme, bedeutet dies, dass ich nur einen einzigen Ausgang Separator ($\) für alle Streams haben kann. Aber im Allgemeinen habe ich mehrere Ströme zum Schreiben geöffnet. Wie kann ich verschiedene Ausgabeseparatoren für sie festlegen?

Antwort

0

Ich habe über Procs gelesen und hier ist eine Idee (vielleicht weit hergeholt). Könnten Sie die verschiedenen Werte von $\, die Sie benötigen, in Procs verpacken (die ihren Erstellungskontext beibehalten)? Sie könnten Ihre Stream-Verarbeitung in dem Block ausführen, der zum Proc gehört.

def stream_1_proc 
    $\ = <value1> 
    return Proc.new { puts $\ } 
end 

def stream_2_proc 
    $\ = <value2> 
    return Proc.new { puts $\ } 
end 

# it seems like this should NOT work because $\ is global, 
# but it works for me in IRB 
stream_1_proc.call # $\ = <value1> 
stream_2_proc.call # $\ = <value2> 

Diese Lösung nicht trocken ist, aber vielleicht stattdessen könnte man ein Argument auf eine einzige Funktion mit dem Wert für $\ geben (dies würde aber $\ zwischen Anrufen überschreiben?).

def stream_proc(output_separator) 
    $\ = output_separator 
    return Proc.new { puts $\ } 
end 
+0

Ja, das ist eine Race-Bedingung. Ein Albtraum zum Debuggen, stelle ich mir vor. –

+0

Blöcke schließen sich über ihre * lexikalische * Umgebung. Variablen, die mit '$' beginnen, sind keine lexikalischen Variablen, sondern globale Variablen. Globale Variablen heißen "globale Variablen", weil sie überall gleich sind. –

1

Ja, es gibt ein globales Record-Trennzeichen und Sie können es nicht per Stream einstellen.