[#20036] Re: Roundoff problem with Float and Marshal — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

16 messages 2003/04/18
[#20045] Re: Roundoff problem with Float and Marshal — nobu.nakada@... 2003/04/20

なかだです。

[#20063] Re: Roundoff problem with Float and Marshal — matz@... (Yukihiro Matsumoto) 2003/04/22

まつもと ゆきひろです

[#20097] jcode.rb — akira yamada / やまだあきら <akira@...>

25 messages 2003/04/26
[#20098] Re: jcode.rb — matz@... (Yukihiro Matsumoto) 2003/04/27

まつもと ゆきひろです

[#20105] Re: jcode.rb — WATANABE Hirofumi <eban@...> 2003/04/28

わたなべです。

[#20108] Re: jcode.rb — matz@... (Yukihiro Matsumoto) 2003/04/28

まつもと ゆきひろです

[ruby-dev:20018] Re: shim/ruby16/tests

From: matz@... (Yukihiro Matsumoto)
Date: 2003-04-13 16:30:32 UTC
List: ruby-dev #20018
まつもと ゆきひろです

In message "[ruby-dev:20013] Re: shim/ruby16/tests"
    on 03/04/12, Tanaka Akira <akr@m17n.org> writes:

|> 私自身はこれで不自然ではないと思いますが、どう思いますか?
|
|とすると、
|
|% ruby -e 'File.open("/dev/null") {|f| IO.new(f.fileno).close }'
|
|というように、ブロック中で file descriptor が close されたときに
|IOError にならないのは不自然ではないんでしょうか。

えーと、これは独立した問題ではないでしょうか。

元々の問題は

  open(path){|f| f.close}

は

  f = open(path)
  begin
    f.close
  ensure
    f.close
  end

となるので、

  f = open(path)
  f.close
  f.close

という実行順序になって例外を発生すると解釈できるので不自然で
はないのではないかという趣旨です。

一方、田中さんが指摘しているのは

  File.open("/dev/null") {|f| IO.new(f.fileno).close }

ですから、つまり

  f = open("/dev/null")
  IO.new(f.fileno).close
  f.close

という実行順序になり、そもそもこれは例外を発生しないので同じ
条件ではないと思います。これが例外を発生させないが不自然では
ないか、というのは意味のある言明だとは思いますが、少なくとも
独立でしょう。

---
で、元の問題に戻ると、二重closeで例外を発生させない方が親切
ではあるが、一方、隠された挙動が増えることになり、正確な説明
がややこしくなるような気もするので、一概に親切な方が良いとも
言いきれないので、決めかねています。

また、田中さんの問題については、同じfile descriptorが複数の
IOから参照される可能性があるということは、きちんとRuby全体で
file decriptorの参照管理を(リファレンスカウントのようなこと
をして)行う必要があるだろうな、と昔から考えてはいます。stdio
を捨てるときに一緒にやろうか、と漠然と考えていたのですが。

                                まつもと ゆきひろ /:|)

In This Thread