ワナベと申します。

2008/06/09 20:22 Tadayoshi Funaba <tadf / dotrb.org>:
>> 以下のように、Rational("355/113") とすると $& が nil になり
>> ます。
>
> 内部で match をつかってるのが影響していると思いますが、どう対処したら
> いいんでしょうね。コンテキストの問題なのか、最初から副作用がないような
> 手段をとらないといけないのか。

単純に backref を一時保存・復帰するのはどうでしょうか。

Index: rational.c
===================================================================
--- rational.c	(revision 17112)
+++ rational.c	(working copy)
@@ -1274,13 +1274,15 @@
 static VALUE
 string_to_r_internal(VALUE self)
 {
-    VALUE s, m;
+    VALUE s, m, backref;

     s = f_strip(self);

     if (RSTRING_LEN(s) == 0)
 	return rb_assoc_new(Qnil, self);

+    backref = rb_backref_get();
+    rb_match_busy(backref);
     m = f_match(rat_pat, s);

     if (!NIL_P(m)) {
@@ -1333,8 +1335,10 @@
 	if (!NIL_P(de))
 	    v = f_div(v, f_to_i(de));

+	rb_backref_set(backref);
 	return rb_assoc_new(v, re);
     }
+    rb_backref_set(backref);
     return rb_assoc_new(Qnil, self);
 }


-- 
ワナベ