From: IWAMURO Motonori Date: 2001-04-04T21:13:29+09:00 Subject: [ruby-dev:12766] String#scan 岩室です。 String#scan でハマったので調べてみたら、 http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/~poffice/mail/ruby-list/5616 とゆーのが、 http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=String に反映されていなかったのですね。RWiki使ってるようですので、直してみよー かと思ったのですが、うまい説明が思い付かずに断念しました(^^; 誰か直し てください(他力本願) あと、gsub に対して sub があるのに、scan に対して一回だけマッチするメ ソッドってないんですね。 http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/~poffice/mail/ruby-list/5622 って解決方法もありますが、なんか見た目が美しくないです。こんな風にしちゃ だめなんでしょうか?(^^; ------------------------------------------------------------------------------ --- string.c.ORIG Wed Apr 4 20:12:13 2001 +++ string.c Wed Apr 4 20:15:29 2001 @@ -2575,8 +2575,8 @@ } static VALUE -rb_str_scan(str, pat) - VALUE str, pat; +str_scan(str, pat, repeat) + VALUE str, pat, repeat; { VALUE result; long start = 0; @@ -2584,11 +2584,16 @@ pat = get_pat(pat); if (!rb_block_given_p()) { - VALUE ary = rb_ary_new(); + VALUE ary = repeat ? rb_ary_new() : Qfalse; while (!NIL_P(result = scan_once(str, pat, &start))) { match = rb_backref_get(); - rb_ary_push(ary, result); + if (ary) { + rb_ary_push(ary, result); + } else { + ary = result; + break; + } } rb_backref_set(match); return ary; @@ -2599,12 +2604,28 @@ rb_match_busy(match); rb_yield(result); rb_backref_set(match); /* restore $~ value */ + if (!repeat) + break; } rb_backref_set(match); return str; } static VALUE +rb_str_scan(str, pat) + VALUE str, pat; +{ + return str_scan(str, pat, Qtrue); +} + +static VALUE +rb_str_scan_once(str, pat) + VALUE str, pat; +{ + return str_scan(str, pat, Qfalse); +} + +static VALUE rb_f_scan(self, pat) VALUE self, pat; { @@ -2848,6 +2869,7 @@ rb_define_method(rb_cString, "include?", rb_str_include, 1); rb_define_method(rb_cString, "scan", rb_str_scan, 1); + rb_define_method(rb_cString, "match", rb_str_scan_once, 1); rb_define_method(rb_cString, "ljust", rb_str_ljust, 1); rb_define_method(rb_cString, "rjust", rb_str_rjust, 1); ------------------------------------------------------------------------------ -- 岩室元典 [E-Mail: vmi@kw.netlaputa.ne.jp / iwa@mmp.fujitsu.co.jp] 「売られたケンカは最後まで買うこと」あきらめるな。食らいついてはなれるな。 眼をそらさずに、背をむけるな。おとしまえをつけるまで、勝負は終わっていない。 (「楽園の魔女たち 〜星が落ちた日〜」樹川さとみ/コバルト文庫)