[#7300] resolver を呼ばない UDPsocket#recvfrom — Toshihiko SHIMOKAWA / 下川俊彦 <toshi@...>

あんまり ruby-dev な話でも無いのですが、ちょっとした機能拡張の提案なので、

12 messages 1999/07/12
[#7321] Re: resolver を呼ばない UDPsocket#recvfrom — Toshihiko SHIMOKAWA / 下川俊彦 <toshi@...> 1999/07/15

From: Toshihiko SHIMOKAWA / 下川俊彦 <toshi@csce.kyushu-u.ac.jp>

[#7313] Ruby 1.3.5 — Yukihiro Matsumoto <matz@...>

Ruby 1.3.5 is out, check out:

59 messages 1999/07/15
[#7318] Re: Ruby 1.3.5 — WATANABE Hirofumi <watanabe@...> 1999/07/15

わたなべです.

[#7326] Re: Ruby 1.3.5 — Wakou Aoyama <wakou@...> 1999/07/15

青山です。

[#7331] Re: Ruby 1.3.5 — matz@... (Yukihiro Matsumoto) 1999/07/16

まつもと ゆきひろです

[#7340] Re: Ruby 1.3.5 — Wakou Aoyama <wakou@...> 1999/07/16

青山です。

[#7368] Re: Ruby 1.3.5 — matz@... (Yukihiro Matsumoto) 1999/07/19

まつもと ゆきひろです

[#7373] Re: Ruby 1.3.5 — Shin-ichiro Hara <sinara@...> 1999/07/19

原です。

[#7374] Re: Ruby 1.3.5 — matz@... (Yukihiro Matsumoto) 1999/07/19

まつもと ゆきひろです

[#7382] Re: Ruby 1.3.5 — Wakou Aoyama <wakou@...> 1999/07/19

青山です。

[#7386] Re: Ruby 1.3.5 — matz@... (Yukihiro Matsumoto) 1999/07/21

まつもと ゆきひろです

[#7388] Re: Ruby 1.3.5 — Wakou Aoyama <wakou@...> 1999/07/21

青山です。

[#7387] [PATCH]extconf.rb, tcltklib.c, and rubytest.rb for NetBSD — Ryo HAYASAKA <hayasaka@...21.u-aizu.ac.jp>

早坂@会津大学です。

10 messages 1999/07/21

[#7466] [PATCH] for djgpp — WATANABE Hirofumi <watanabe@...>

わたなべです.

21 messages 1999/07/29
[#7467] Re: [PATCH] for djgpp — Katsuyuki Komatsu <komatsu@...> 1999/07/29

小松です。

[ruby-dev:7396] Re: Ruby 1.3.5

From: Wakou Aoyama <wakou@...>
Date: 1999-07-22 15:03:35 UTC
List: ruby-dev #7396
青山です。

Thu, Jul 22, 1999 at 06:04:50PM +0900 において
Shin-ichiro Hara さん曰く:

> これに賛成!(^^;; と、いうか EOF に達しているけど、eof? は false
> であることを許す、といったらいいのかな。(つまり必ずしも eof?
> は EOF にポインタが来ていることを表さない。)EOF という言葉が
> いろんな意味で使われてごちゃごちゃになってますね、、、

そうなんですよね。EOF というデータは存在しない。存在しないものにポイン
タが来る事はありえない。しかし、語感から、データの最後の位置というポイ
ントを示すように受け取られている。ややこしいです。

EOF を表示するエディタがありますが、ポインタとして考える場合は、あのよ
うに、EOF というのはファイルの末尾ではなく、末尾 + 1 のように見ると近
いようにも思われます。

> すなわち、eof? は
> 
>   直前の1バイト以上の読み込みで読み込み終了になった場合 ture、
>   そうでないとき false。
>   直前に1バイト以上の読み込みをしてない場合は不定(か true)。
> 
> みたいに正式に定義してしまうのが良い、と思うようになりました。

そうですね。このようにポインタから離れた定義をドキュメントにも書いてし
まうのが良さそうですね。

ただし、その定義としては「直前の」ではなく、「過去に」のようです。

  過去に読み込みに失敗した事がある場合 true

read() や read(n) はエラーをトラップしてしまっているので表面化しません
が、上記の「読み込み終了」にあたる部分は、本当は EOFError が発生した場
合です。

$ /usr/src/ruby/ruby -e 'io = open("0"); p io.stat.size
p io.eof?
p io.sysread(1024)
p io.eof?
'
0
false
/tmp/rbXBKqfG:3:in `sysread': End of file reached (EOFError)
        from /tmp/rbXBKqfG:3

これをたまたま read では 0 バイトより大きなデータが得られた場合には返
さないようにしているだけで、もしかすると、read の方のドキュメントに問
題があるのかもしれないですね。

単に EOF で nil を返します。ではなく、1バイトも得られず EOFError が発
生した場合には nil を返します。とか。実装もこうなっているわけですし。

> さて、read(0) の返り値についてですが、私は
> 
>   io.read(0) は io の状態にかかわらず常に nil を返す
> 
> を提案します。これは私の最初の提案なんだけど、理由はちょっと変わって
> 
>   "read(2)" では read(,,0) の返り値は 0 としている
> 
> からです。
> 
> これでいえば、0バイトファイルは read(0) は nil だけど eof? は
> false なわけです。(どちらを何回やっても。)
> 
> さらにこの際、「"read(2)" が 0 を返す場合は Ruby の read(n) も nil
> を返す」ことにしちまったらどうでしょう。

そうですね。ドキュメントに明記すれば、これでもいいと思います。

> 一方、残る問題 read() ですが、0バイトファイルに read() を2回
> したとき、
> 
> (1) "", ""
> (2) "", nil
> 
> のどっちにするかですね。つまり
> 
> (1a) read() は read(n) と全く違うものと思う
> (2a) read() は read(n) と類似と思う
> 
> の違いです。私は (1a) を推しています。0バイトファイルに対して
> 1回目の read() が "" であるのに read(0) は nil なので、read()
> と read(n) が類似とはいえないから、というのが一つの論拠です。

あ、なるほど。上記の read(0) を採用すると (1) になるわけですね。

しかし、実はそれ以前に read は EOFError を隠しているという面があります
ので、read(0) も含めて (2) 案というのもありかもしれません。

これは、セットになるでしょうか。read(0) の扱いしだい。


-- 
青山 和光 Wakou Aoyama <wakou@fsinet.or.jp>

In This Thread