まつもと ゆきひろです

In message "[ruby-dev:22473] Re: ARGF.each {|x| ARGF.eof? } and number of Ctrl-Ds."
    on 04/01/02, Tanaka Akira <akr / m17n.org> writes:

|> それはそれとして、なぜSTDINは3度^Dが必要なんでしょう?
|>
|>   バッファのフラッシュで1度
|>   バッファ内容をプログラムに送るので1度(最初のyield)
|>   eachを終了させるのに1度
|>
|> のように見えるんだけど。
|
|ここでいうフラッシュの意味はよく分かりませんが、私の理解で ^D が3回必
|要なのは、
|1つめの ^D で "a" が送られ、
|2つめの ^D で EOF が送られて行が終り、
|3つめの ^D で EOF が送られてループが終るからです。
|
|each は一行づつ読むわけですが、最初の read(2) で受け取る "a" には行末
|記号(\n)が含まれていないので行はまだ終っていないと判断し、次の read(2)
|で EOF が来て行が(行末記号無しに) EOF で終ったんだと判断します。で、
|each の次の繰り返しでまた行を読むことになり、ここでの read(2) で EOF
|が来て行がないということが判明して each が終了します。

納得できます。でも、「バッファのフラッシュ」って最初に言った
の田中さんじゃないですか。

In message "[ruby-dev:22469] ARGF.each {|x| ARGF.eof? } and number of Ctrl-Ds."
    on 04/01/01, Tanaka Akira <akr / m17n.org> writes:

|最初の ^D は行バッファの flush なので

え、フラッシュじゃなくflushってこと?

|で、もし EOF が 2回必要なのが不自然でよろしくないというなら... どうし
|たらいいですかねぇ。

いや、単に疑問に思っただけですので。直そうと思ってはいません。

|> emacs上のデバッガからは1度eofを送る
|> と終了しますから、terminalがなにかしているのだと思うのですが。
|
|terminal と emacs のどちらを疑うかを選ぶなら、私は emacs を疑います。

「疑う」とはネガティブな表現でどちらかが間違っていることを示
唆しますが、私は「3度の原因はterminalにある」と推測しただけ
なんで。
				まつもと ゆきひろ /:|)