[#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:7395] Re: Ruby 1.3.5

From: Shin-ichiro Hara <sinara@...>
Date: 1999-07-22 09:04:50 UTC
List: ruby-dev #7395
原です。

|Wed, Jul 21, 1999 at 05:57:28PM +0900 において
|Yukihiro Matsumoto さん曰く:
|
|> まず第1にストリームポインタが末尾にあるとき、これを
|> 
|>   * EOFとみなす
|>   * EOFとみなさない
|> 
|> という点があります。原さんは「みなさない」方が単純で良いので
|> はないかということですね。私はこちらにはあまりこだわりはあり
|> ませんが、「みなす」方がstdioの設計になじむようには思います。

あれ?私は常に「みなす」方を推していたんですが、、、

でも、"eof(3)" の挙動を考えてとちょっと考え直しました。(^^;

In message "[ruby-dev:7394] Re: Ruby 1.3.5"
    on 99/07/21, Wakou Aoyama <wakou@fsinet.or.jp> writes:
|
|青山です。

|この事から、ファイル以外も扱う IO クラスの機能としては、ストリームポイ
|ンタによる EOF の判定は行うべきではなく、それが末尾と思われる位置(?)に
|あっても、やはり EOF とはみなさない方が良いのではないかと思われます。

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

すなわち、eof? は

  直前の1バイト以上の読み込みで読み込み終了になった場合 ture、
  そうでないとき false。
  直前に1バイト以上の読み込みをしてない場合は不定(か true)。

みたいに正式に定義してしまうのが良い、と思うようになりました。

したがって、いきなり iof? は良くない:

  while !io.eof?
    s.concat io.read(1024)
  end

というコードはあまり勧められない。正しいのは

  loop do
    s.concat io.read(1024)
    break if io.eof?
  end

である。と、いうことになりますか。つまり、

|そして、[ruby-dev:7388] のように、ファイルサイズが 0 の場合でも、
|長さが 0 より大きな read(n) を行うまでは EOF を返しません。

と、いうことです。

|さらに、EOF を返すのは、2度目という基準ではなく、0 よりも大きな長さの
|read(n) を行った後となっています。read(0) は何度行っても EOF の判定に
|影響しません。これは、 read(0) はファイルポインタを動かさないとみなし
|ているのでしょう。

これも同意します。Ruby でも read(0) は eof? に対しても全く影響を
与えないことにしたらいいと思います。

さて、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
を返す」ことにしちまったらどうでしょう。

で、これで結果がどうなるか、 差分を #=> の後に書きます。

|$ /usr/src/ruby/ruby -e 'io = open("0"); p io.stat.size
|p io.eof?
|p io.read(1)
|p io.eof?
|p io.read(1)
|'
|0
|false
""     #=> nil
|true
|nil
|
|$ /usr/src/ruby/ruby -e 'io = open("0"); p io.stat.size
|p io.eof?
|p io.read(1)
|p io.eof?
|p io.read(0)
|'
|0
|false
""     #=> nil
|true
|nil
|
|$ /usr/src/ruby/ruby -e 'io = open("0"); p io.stat.size
|p io.eof?
|p io.read(0)
|p io.eof?
|p io.read(0)
|'
|0
|false
""     #=> nil
|false
""     #=> nil
|
|$ /usr/src/ruby/ruby -e 'io = open("0"); p io.stat.size
|p io.eof?
|p io.read(0)
|p io.eof?
|p io.read(1)
|p io.eof?
|'
|0
|false
""     #=> nil
|false
""     #=> nil
|true


一方、残る問題 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) が類似とはいえないから、というのが一つの論拠です。

In This Thread