From: UENO Katsuhiro Date: 2002-02-01T04:15:58+09:00 Subject: [ruby-dev:15830] [ 提案 ] puts, print 等を IO から分離 うえのです。 以前 [ruby-list:23284] で提案したことと同じですが、Ruby/zlib のような IO クラスに似せたインターフェースを持つクラスを書くにあたって、 write メソッドから puts や print 等を定義するモジュールがあると 嬉しいです。 現状の IO#puts, IO#print, IO#printf, IO#<< は rb_io_write から 自分自身の write メソッドを呼び出すことで書き込みを実現していますから、 これらを IO から分離して Writable というモジュールを丁稚上げてみました。 # 欲しいのは割と複雑な仕様の puts と print で、<< と printf は # 言ってしまえばオマケです。 こんな感じで分離して頂けると、IO が変更される度に手で GzipWriter を IO に同期させる必要が無くなるのですが、いかがでしょうか。 なお、read から gets 等を定義するモジュール (Readable?) も考えられる のですが、抽象化と最適化のトレードオフを考えるとデメリットのほうが 大きいと思われますので、こちらは敢えて要求しません。 Index: io.c =================================================================== RCS file: /src/ruby/io.c,v retrieving revision 1.109 diff -u -r1.109 io.c --- io.c 2002/01/23 07:30:39 1.109 +++ io.c 2002/01/31 18:53:35 @@ -83,6 +83,7 @@ VALUE rb_cIO; VALUE rb_eEOFError; VALUE rb_eIOError; +VALUE rb_mWritable; VALUE rb_stdin, rb_stdout, rb_stderr, rb_defout; static VALUE orig_stdin, orig_stdout, orig_stderr; @@ -281,7 +282,7 @@ } static VALUE -rb_io_addstr(io, str) +rb_writable_addstr(io, str) VALUE io, str; { rb_io_write(io, str); @@ -2111,7 +2112,7 @@ } static VALUE -rb_io_printf(argc, argv, out) +rb_writable_printf(argc, argv, out) int argc; VALUE argv[]; VALUE out; @@ -2142,7 +2143,7 @@ } static VALUE -rb_io_print(argc, argv, out) +rb_writable_print(argc, argv, out) int argc; VALUE *argv; VALUE out; @@ -2181,7 +2182,7 @@ int argc; VALUE *argv; { - rb_io_print(argc, argv, rb_defout); + rb_writable_print(argc, argv, rb_defout); return Qnil; } @@ -2214,10 +2215,10 @@ return rb_io_putc(rb_defout, ch); } -static VALUE rb_io_puts _((int, VALUE*, VALUE)); +static VALUE rb_writable_puts _((int, VALUE*, VALUE)); static VALUE -io_puts_ary(ary, out) +writable_puts_ary(ary, out) VALUE ary, out; { VALUE tmp; @@ -2228,13 +2229,13 @@ if (rb_inspecting_p(tmp)) { tmp = rb_str_new2("[...]"); } - rb_io_puts(1, &tmp, out); + rb_writable_puts(1, &tmp, out); } return Qnil; } static VALUE -rb_io_puts(argc, argv, out) +rb_writable_puts(argc, argv, out) int argc; VALUE *argv; VALUE out; @@ -2254,7 +2255,7 @@ else { line = rb_check_convert_type(argv[i], T_ARRAY, "Array", "to_ary"); if (!NIL_P(line)) { - rb_protect_inspect(io_puts_ary, line, out); + rb_protect_inspect(writable_puts_ary, line, out); continue; } line = rb_obj_as_string(argv[i]); @@ -2273,7 +2274,7 @@ int argc; VALUE *argv; { - rb_io_puts(argc, argv, rb_defout); + rb_writable_puts(argc, argv, rb_defout); return Qnil; } @@ -3530,6 +3531,12 @@ rb_define_global_function("p", rb_f_p, -1); rb_define_method(rb_mKernel, "display", rb_obj_display, -1); + rb_mWritable = rb_define_module("Writable"); + rb_define_method(rb_mWritable, "puts", rb_writable_puts, -1); + rb_define_method(rb_mWritable, "print", rb_writable_print, -1); + rb_define_method(rb_mWritable, "printf", rb_writable_printf, -1); + rb_define_method(rb_mWritable, "<<", rb_writable_addstr, 1); + rb_cIO = rb_define_class("IO", rb_cObject); rb_include_module(rb_cIO, rb_mEnumerable); @@ -3563,10 +3570,8 @@ rb_define_method(rb_cIO, "clone", rb_io_clone, 0); rb_define_method(rb_cIO, "reopen", rb_io_reopen, -1); - rb_define_method(rb_cIO, "print", rb_io_print, -1); + rb_include_module(rb_cIO, rb_mWritable); rb_define_method(rb_cIO, "putc", rb_io_putc, 1); - rb_define_method(rb_cIO, "puts", rb_io_puts, -1); - rb_define_method(rb_cIO, "printf", rb_io_printf, -1); rb_define_method(rb_cIO, "each", rb_io_each_line, -1); rb_define_method(rb_cIO, "each_line", rb_io_each_line, -1); @@ -3595,7 +3600,6 @@ rb_define_method(rb_cIO, "getc", rb_io_getc, 0); rb_define_method(rb_cIO, "readchar", rb_io_readchar, 0); rb_define_method(rb_cIO, "ungetc",rb_io_ungetc, 1); - rb_define_method(rb_cIO, "<<", rb_io_addstr, 1); rb_define_method(rb_cIO, "flush", rb_io_flush, 0); rb_define_method(rb_cIO, "tell", rb_io_tell, 0); rb_define_method(rb_cIO, "seek", rb_io_seek_m, -1); Index: ruby.h =================================================================== RCS file: /src/ruby/ruby.h,v retrieving revision 1.57 diff -u -r1.57 ruby.h --- ruby.h 2001/12/21 07:20:23 1.57 +++ ruby.h 2002/01/31 18:53:37 @@ -535,6 +535,7 @@ EXTERN VALUE rb_mGC; EXTERN VALUE rb_mMath; EXTERN VALUE rb_mProcess; +EXTERN VALUE rb_mWritable; EXTERN VALUE rb_cObject; EXTERN VALUE rb_cArray; -- ---- - - - -- - うえの かつひろ