From: matz@... (Yukihiro Matsumoto) Date: 2000-01-31T10:17:13+09:00 Subject: [ruby-talk:01202] Re: Question about 'open' Hi, In message "[ruby-talk:01197] Question about 'open'" on 00/01/29, Dave Thomas writes: |However, | | open("|-", "w+") { |f| | if f == nil | print "in Child\n" | else | print "Got: ", f.gets, "\n" | end | } | |outputs | | Got: nil Oops, I forgot to execute a block in child process. --- /tmp/io.c Mon Jan 31 10:16:02 2000 +++ io.c Mon Jan 31 10:12:43 2000 @@ -1570,7 +1576,12 @@ } Check_SafeStr(pname); port = pipe_open(RSTRING(pname)->ptr, mode); - if (NIL_P(port)) return Qnil; + if (NIL_P(port)) { + rb_yield(port); + } + else if (rb_iterator_p()) { + return rb_ensure(rb_yield, port, rb_io_close, port); + } return port; } @@ -1641,8 +1652,10 @@ } port = pipe_open(RSTRING(pname)->ptr+1, mode); - if (NIL_P(port)) return Qnil; - if (rb_iterator_p()) { + if (NIL_P(port)) { + rb_yield(port); + } + else if (rb_iterator_p()) { return rb_ensure(rb_yield, port, rb_io_close, port); }