2017-02-20 4 views
0

ための設定出力セパレータ(クロスポスト注:この質問はすでに回答を得ることなくhttps://www.ruby-forum.com/topic/6879239に頼まれました)ルビー:IOオブジェクト

IOの#プリントのドキュメントから:

は、「(特定のオブジェクトを書き込みs)からios。...出力レコードセパレータ ($\)がnilでない場合、出力に追加されます。

これを文字通り取ると、すべてのストリームに対して単一の出力 セパレータ($\)しか持てないことを意味します。しかし、一般的に私はいくつかのストリーム を書くために開いている。それらのために異なる出力セパレータを設定するにはどうすればよいですか?

答えて

0

私はProcsについて読んでおり、ここにはアイデアがあるかもしれません。あなたは、(あなたの作成コンテキストを維持する)Procsに必要な$\の異なる値をパッケージ化できますか? Procに属するブロック内でストリーム処理を行うことができます。解決策はDRYではありませんが、多分その代わり、あなたが$\の値を持つ単一の関数に引数を渡すことができることを

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> 

(しかし$\呼び出しの間上書きされるのでしょうか?)。

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

これは競合状態です。デバッグする悪夢、私は想像します。 –

+0

ブロックは、それらのレキシカル*環境で閉じる。 '$ 'で始まる変数は字句変数ではなく、グローバル変数です。グローバル変数はどこでも同じであるため、グローバル変数はグローバル変数と呼ばれます。 –

1

はい、グローバルレコードセパレータは1つで、ストリームごとに設定することはできません。