[#44725] Set[Set[1]]==Set[Set[1]] は偽? — "5.5" <5.5@...>

5.5 です。

22 messages 2008/03/04

[#44782] $stdin.rewind が exec した子プロセスに伝わらない? — SATOH Fumiyasu <fumiyas@...>

さとうふみやす @ OSS テクノロジです。

11 messages 2008/03/17
[#44783] Re: $stdin.rewind が exec した子プロセスに伝わらない? — Kazuhiro NISHIYAMA <zn@...> 2008/03/17

西山和広です。

[ruby-list:44717] Re: パイプ経由コマンド実行?

From: Yukihiro Matsumoto <matz@...>
Date: 2008-03-03 06:15:12 UTC
List: ruby-list #44717
まつもと ゆきひろです

In message "Re: [ruby-list:44716] Re: パイプ経由コマンド実行?"
    on Mon, 3 Mar 2008 15:05:58 +0900, "m-morita" <m-morita@ybrain.co.jp> writes:

|ただ言語使用として合点がいきません。
|より実情に即して例示します。
| require "open-uri"
| open("|ruby t.rb","w").write open("http://www.google.co.jp").read # -- (1)
| # ... many executions as above
| open("|ruby t.rb","w").write("AAAA")
|
|ここで (1) の終了時点で t.rb にデータがわたってきません(デバッガーで
|ステップ実行すればわかります)。
|しかし、この一行で読み書きは完了しています。
|読み書き途中のまま次のスクリプト行に移っていませんし、この行の次へ行っ
|てしまうと、実装側もこのI/O が見えなくなっているはずです。(結局、インタ
|ープリタ終了時に吐き出されるようですが,,,)

Rubyにはopen()されたものがもう使われないということを知る手段
がありませんから、「ここでフラッシュするべきだ」という判断を
行うすべがありません。むやみにフラッシュすると今度はIO性能の
低下を引き起こしますし。

となると明示的にクローズする

 open("|ruby t.rb","w"){|f|f.write open("http://www.google.co.jp").read}

と書いていただくのがよいのではないかと思います。7文字ほど増
えちゃいますが。

In This Thread