[前][次][番号順一覧][スレッド一覧]

ruby-changes:4769

From: ko1@a...
Date: Fri, 2 May 2008 13:52:28 +0900 (JST)
Subject: [ruby-changes:4769] matz - Ruby:r16263 (ruby_1_8): * re.c (match_select): restore previous behavior of MatchData#select.

matz	2008-05-02 13:51:58 +0900 (Fri, 02 May 2008)

  New Revision: 16263

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/re.c

  Log:
    * re.c (match_select): restore previous behavior of MatchData#select.
      RDoc updated as well, mentioning the plan to remove this method
      in the future.  [ruby-dev:34556]

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/re.c?r1=16263&r2=16262&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ChangeLog?r1=16263&r2=16262&diff_format=u

Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 16262)
+++ ruby_1_8/ChangeLog	(revision 16263)
@@ -1,3 +1,9 @@
+Fri May  2 13:47:51 2008  Yukihiro Matsumoto  <matz@r...>
+
+	* re.c (match_select): restore previous behavior of MatchData#select.
+	  RDoc updated as well, mentioning the plan to remove this method
+	  in the future.  [ruby-dev:34556]
+
 Fri May  2 13:04:04 2008  Yukihiro Matsumoto  <matz@r...>
 
 	* ext/dbm/dbm.c (Init_dbm): defines DBM::VERSION even when
Index: ruby_1_8/re.c
===================================================================
--- ruby_1_8/re.c	(revision 16262)
+++ ruby_1_8/re.c	(revision 16263)
@@ -1219,7 +1219,6 @@
 /*
  *  call-seq:
  *     mtch.values_at([index]*)   => array
- *     mtch.select([index]*)      => array
  *  
  *  Uses each <i>index</i> to access the matching values, returning an array of
  *  the corresponding matches.
@@ -1239,7 +1238,46 @@
 }
 
 
+/*
+ *  call-seq:
+ *     mtch.select{|obj| block}   => array
+ *  
+ *  Returns an array containing match strings for which <em>block</em>
+ *  gives <code>true</code>.  MatchData#select will be removed from Ruby 1.9.
+ *     
+ *     m = /(.)(.)(\d+)(\d)/.match("THX1138: The Movie")
+ *     p m.select{|x| /X/ =~ x}   #=> ["HX1138", "X"]
+ */
 
+static VALUE
+match_select(argc, argv, match)
+    int argc;
+    VALUE *argv;
+    VALUE match;
+{
+    if (argc > 0) {
+	rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc);
+    }
+    else {
+	struct re_registers *regs = RMATCH(match)->regs;
+	VALUE target = RMATCH(match)->str;
+	VALUE result = rb_ary_new();
+	int i;
+	int taint = OBJ_TAINTED(match);
+
+	for (i=0; i<regs->num_regs; i++) {
+	    VALUE str = rb_str_substr(target, regs->beg[i], regs->end[i]-regs->beg[i]);
+	    if (taint) OBJ_TAINT(str);
+	    if (RTEST(rb_yield(str))) {
+		rb_ary_push(result, str);
+	    }
+	}
+	return result;
+    }
+}
+
+
+
 /*
  *  call-seq:
  *     mtch.to_s   => str
@@ -2326,7 +2364,7 @@
     rb_define_method(rb_cMatch, "[]", match_aref, -1);
     rb_define_method(rb_cMatch, "captures", match_captures, 0);
     rb_define_method(rb_cMatch, "values_at", match_values_at, -1);
-    rb_define_method(rb_cMatch, "select", match_values_at, -1);
+    rb_define_method(rb_cMatch, "select", match_select, -1);
     rb_define_method(rb_cMatch, "pre_match", rb_reg_match_pre, 0);
     rb_define_method(rb_cMatch, "post_match", rb_reg_match_post, 0);
     rb_define_method(rb_cMatch, "to_s", match_to_s, 0);

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]