Hi,
In message "[ruby-talk:01197] Question about 'open'"
on 00/01/29, Dave Thomas <Dave / thomases.com> 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);
}