[#28446] named capture and /g, /G option — "K.Kosako" <sndgk393@...>

Ruby 1.9に、

30 messages 2006/03/21
[#28449] Re: named capture and /g, /G option — "K.Kosako" <sndgk393@...> 2006/03/21

> Ruby 1.9に、

[#28452] Re: named capture and /g, /G option — Yukihiro Matsumoto <matz@...> 2006/03/21

まつもと ゆきひろです

[#28453] Re: named capture and /g, /G option — "K.Kosako" <sndgk393@...> 2006/03/21

Yukihiro Matsumoto wrote:

[ruby-dev:28471] aliasとcaller

From: "U.Nakamura" <usa@...>
Date: 2006-03-27 13:07:19 UTC
List: ruby-dev #28471
こんにちは、なかむら(う)です。

元ネタは
 http://www.yohasebe.com/diary/diary_search.php?id=142
なのですが、このスクリプトは、実は現在の1.8最新および1.9では
動作しません。

話を単純化して、

  def __method__
    caller.first.sub!(/^.*in `(?:.+?\#)?(.+)'$/, '\\1')
  end
  
  def foo
    p __method__
  end
  
  alias bar foo
  alias baz foo
  
  foo
  bar
  baz

というスクリプトtest.rbがあったとき、

  % ruby-1.6 -v test.rb
  ruby 1.6.8 (2003-07-27) [i586-mswin32]
  "foo"
  "foo"
  "foo"

  % ruby-1.8.1 -v test.rb
  ruby 1.8.1 (2003-12-25) [i386-mswin32]
  "foo"
  "bar"
  "baz"

  % ruby-1.8.4 -v test.rb
  ruby 1.8.4 (2005-12-25) [i386-mswin32]
  "foo"
  "bar"
  "baz"

  % ruby-1.8 -v test.rb
  ruby 1.8.4 (2006-03-23) [i386-mswin32]
  "foo"
  "foo"
  "foo"

  % ruby-1.9 -v test.rb
  ruby 1.9.0 (2006-03-26) [i386-mswin32]
  "foo"
  "foo"
  "foo"

というように、1.8系のリリース版のみ結果が異なります。
# 手元には1.8.0がなかったので試してませんが、1.8.0も他のリリ
# ース版と同様の結果になります。

alias時のcallerはどうなるべきか、という話を考え始めると、いろ
いろ難しいのですが、1.8リリース系列内での互換性を考えると、少
なくとも1.8系ではaliasされた名前が取れるべきであると思います。
また、どっちが便利か、という話になれば、aliasされた名前が取れ
た方が便利な気もします。

1.9でも、過去(2004年とか)はaliasされた名前が取れていたのです
が、1.8にせよ1.9にせよ、なぜaliasされた名前が取れるようになっ
たのか、なぜ今は取れなくされたのか、という意図はよくわかりま
せん。
というわけで、ふかーい理由がそこにあるならば諦めますが、特に
ないならご検討を願います。


おまけとして、1.8および1.9それぞれ用の修正(?)パッチをつけとき
ます。

Index: eval.c
===================================================================
RCS file: /home/cvs/ruby/eval.c,v
retrieving revision 1.616.2.166
diff -u -1 -p -r1.616.2.166 eval.c
--- eval.c	23 Mar 2006 01:52:02 -0000	1.616.2.166
+++ eval.c	27 Mar 2006 13:05:11 -0000
@@ -6191,3 +6191,3 @@ backtrace(lev)
 		     ruby_sourcefile, ruby_sourceline,
-		     rb_id2name(frame->orig_func));
+		     rb_id2name(frame->last_func));
 	}
@@ -6216,3 +6216,3 @@ backtrace(lev)
 		     n->nd_file, nd_line(n),
-		     rb_id2name(frame->prev->orig_func));
+		     rb_id2name(frame->prev->last_func));
 	}

Index: eval.c
===================================================================
RCS file: /home/cvs/ruby/eval.c,v
retrieving revision 1.890
diff -u -1 -p -r1.890 eval.c
--- eval.c	23 Feb 2006 04:24:39 -0000	1.890
+++ eval.c	27 Mar 2006 13:05:21 -0000
@@ -1110,3 +1110,3 @@ error_line(struct FRAME *frame, NODE *no
 		return rb_sprintf("%s:%d:in `%s'", file, line,
-				  rb_id2name(frame->this_func));
+				  rb_id2name(frame->callee));
 	    }
@@ -1123,3 +1123,3 @@ error_line(struct FRAME *frame, NODE *no
 				  rb_class2name(oklass),
-				  rb_id2name(frame->this_func));
+				  rb_id2name(frame->callee));
 	    }

それでは。
-- 
U.Nakamura <usa@garbagecollect.jp>



In This Thread

Prev Next