From: matz@... (Yukihiro Matsumoto) Date: 2004-01-02T11:06:20+09:00 Subject: [ruby-dev:22474] Re: ARGF.each {|x| ARGF.eof? } and number of Ctrl-Ds. まつもと ゆきひろです In message "[ruby-dev:22473] Re: ARGF.each {|x| ARGF.eof? } and number of Ctrl-Ds." on 04/01/02, Tanaka Akira 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 writes: |最初の ^D は行バッファの flush なので え、フラッシュじゃなくflushってこと? |で、もし EOF が 2回必要なのが不自然でよろしくないというなら... どうし |たらいいですかねぇ。 いや、単に疑問に思っただけですので。直そうと思ってはいません。 |> emacs上のデバッガからは1度eofを送る |> と終了しますから、terminalがなにかしているのだと思うのですが。 | |terminal と emacs のどちらを疑うかを選ぶなら、私は emacs を疑います。 「疑う」とはネガティブな表現でどちらかが間違っていることを示 唆しますが、私は「3度の原因はterminalにある」と推測しただけ なんで。 まつもと ゆきひろ /:|)