なかだです。

Kernel#putsやKernel#putcが$stdoutに委譲するように、Kernel#getsや
readlineなどもARGFに委譲するようにしてはどうでしょうか。


Index: io.c =================================================================== --- io.c (revision 15813) +++ io.c (working copy) @@ -5228,6 +5228,16 @@ argf_lineno_setter(VALUE val, ID id, VAL */ +static VALUE argf_gets(int, VALUE *, VALUE); +static VALUE +rb_f_gets(int argc, VALUE *argv, VALUE recv) +{ + if (recv == argf) { + return argf_gets(argc, argv, argf); + } + return rb_funcall2(argf, rb_intern("gets"), argc, argv); +} + static VALUE -rb_f_gets(int argc, VALUE *argv) +argf_gets(int argc, VALUE *argv, VALUE argf) { VALUE line; @@ -5244,5 +5254,5 @@ rb_gets(void) if (rb_rs != rb_default_rs) { - return rb_f_gets(0, 0); + return rb_f_gets(0, 0, argf); } @@ -5274,6 +5284,16 @@ rb_gets(void) */ +static VALUE argf_readline(int, VALUE *, VALUE); static VALUE -rb_f_readline(int argc, VALUE *argv) +rb_f_readline(int argc, VALUE *argv, VALUE recv) +{ + if (recv == argf) { + return argf_readline(argc, argv, argf); + } + return rb_funcall2(argf, rb_intern("readline"), argc, argv); +} + +static VALUE +argf_readline(int argc, VALUE *argv, VALUE argf) { VALUE line; @@ -5281,5 +5301,5 @@ rb_f_readline(int argc, VALUE *argv) if (!next_argv()) rb_eof_error(); ARGF_FORWARD(argc, argv); - line = rb_f_gets(argc, argv); + line = argf_gets(argc, argv, argf); if (NIL_P(line)) { rb_eof_error(); @@ -5299,6 +5319,16 @@ rb_f_readline(int argc, VALUE *argv) */ +static VALUE argf_readlines(int, VALUE *, VALUE); static VALUE -rb_f_readlines(int argc, VALUE *argv) +rb_f_readlines(int argc, VALUE *argv, VALUE recv) +{ + if (recv == argf) { + return argf_readlines(argc, argv, argf); + } + return rb_funcall2(argf, rb_intern("readlines"), argc, argv); +} + +static VALUE +argf_readlines(int argc, VALUE *argv, VALUE argf) { VALUE line, ary; @@ -6903,8 +6933,8 @@ Init_IO(void) rb_define_method(rb_cARGF, "read", argf_read, -1); rb_define_method(rb_cARGF, "readpartial", argf_readpartial, -1); - rb_define_method(rb_cARGF, "readlines", rb_f_readlines, -1); - rb_define_method(rb_cARGF, "to_a", rb_f_readlines, -1); - rb_define_method(rb_cARGF, "gets", rb_f_gets, -1); - rb_define_method(rb_cARGF, "readline", rb_f_readline, -1); + rb_define_method(rb_cARGF, "readlines", argf_readlines, -1); + rb_define_method(rb_cARGF, "to_a", argf_readlines, -1); + rb_define_method(rb_cARGF, "gets", argf_gets, -1); + rb_define_method(rb_cARGF, "readline", argf_readline, -1); rb_define_method(rb_cARGF, "getc", argf_getc, 0); rb_define_method(rb_cARGF, "getbyte", argf_getbyte, 0);
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦