From: "小西 弘将" Date: 2008-03-03T18:01:49+09:00 Subject: [ruby-list:44722] Re: パイプ経由コマンド実行?  小西 弘将です。 GC時にオブジェクトが廃棄されるときにはクローズされるかと。ただ、処理終了 (スコープアウト)の瞬間にGCで回収されるというのは間違いです。 意図的にGCさせるときは、GC.startですが、それ以外の場合は、Rubyにとって適 当なタイミングでGCがおきますので、スコープを監視してGCするわけではないこ とに注意が必要です。 パイプは明示的にCloseあるいはFlushする習慣をつけた方が、びっくりがないと 思います。 >まつもと様 > >もりた です。懇切丁寧なご説明ありがとうございます。 >> | open("foo","w").write("a\n") >> | open("foo","w").write("b\n") >> >> 上のプログラムでは最初の行でopenしていますが、一度writeしたあ >> と放置されていますので、IOオブジェクトは今後書き込みがあるか >> もしれないので、バッファをflushしません。openの戻り値を他で参 >> 照していないので、人間は「もう終わった」と思うかもしれません >> が、それはRubyの関知するところではないからです。 >そうでしたか、わかりました。IO オブジェクトは変数と別管理になって >いるのですね。 > >私の思い違いは「open の際に局所的な変数(オブジェクト)を生成して、 >その変数がバッファを内包していると思っていて、それがソース上の >スコープにある変数に代入されなければ、処理終了後その変数は GC >対象であり、その時点で終末処理できる」でした。 > >> どのように思っていらっしゃったかは知る由もないのですが、はっ >> きり言えることは「なんらかの方法でちゃんとcloseしてください」 >> です。 >はい。アドバイスありがとうございます。