[ruby-trunk - Feature #4043] グローバル関数current classの提案

Issue #4043 has been updated by Shyouhei U…

Makoto K. wrote:

採用を妨げるものとしては何がありますでしょうか?

やっぱ名前じゃないですかねえ。機能に反対している人は少ないように思われます。

Feature #4043: グローバル関数current_classの提案

Author: Makoto K.
Status: Open
Priority: Low
Assignee:
Category: core
Target version: 2.0.0

=begin
カレントクラス(MRIの内部でいうところのcref)をRubyから調べられるメソッドcurrent_classを提案します。
グローバル関数(Kernelのプライベートメソッド)にする理由は、self(ないしなんらかのオブジェクト)とは関係ない値を返すメソッドであるため、です。
ユースケースですが、例えば以下のようにして、モジュールのinstance_evalとmodule_evalの違いをRubyプログラマが確かめることができ、Rubyの理解に役立ちます。

$ irb19
irb(main):001:0> module M ; end
=> nil
irb(main):002:0> M.instance_eval { current_class }
=> #Class:M
irb(main):003:0> M.module_eval { current_class }
=> M

差分を付けますが、クイックハックですので修正が必要かと思います。

diff --git a/object.c b/object.c
index 75192c1…82ad85a 100644
— a/object.c
+++ b/object.c
@@ -2408,6 +2408,13 @@ rb_f_array(VALUE obj, VALUE arg)
return rb_Array(arg);
}

+VALUE rb_vm_cref_cls(void);
+static VALUE
+rb_f_current_class(VALUE obj)
+{

  • return rb_vm_cref_cls();
    +}

/*

  • Document-class: Class

@@ -2588,6 +2595,8 @@ Init_Object(void)
rb_define_global_function(“String”, rb_f_string, 1);
rb_define_global_function(“Array”, rb_f_array, 1);

  • rb_define_global_function(“current_class”, rb_f_current_class, 0);
  • rb_cNilClass = rb_define_class(“NilClass”, rb_cObject);
    rb_define_method(rb_cNilClass, “to_i”, nil_to_i, 0);
    rb_define_method(rb_cNilClass, “to_f”, nil_to_f, 0);
    diff --git a/vm.c b/vm.c
    index 980e7ea…dcc43df 100644
    — a/vm.c
    +++ b/vm.c
    @@ -819,6 +819,12 @@ rb_vm_cref(void)
    return vm_get_cref(cfp->iseq, cfp->lfp, cfp->dfp);
    }

+VALUE
+rb_vm_cref_cls(void)
+{

  • return rb_vm_cref()->nd_clss;
    +}

#if 0
void
debug_cref(NODE *cref)
=end

$B$-$7$b$H$G$9(B

On Wed, 15 Feb 2012 18:05:12 +0900
Shyouhei U. [email protected] wrote:

Issue #4043 has been updated by Shyouhei U…

Makoto K. wrote:

$B:NMQ$rK8$2$k$b$N$H$7$F$O2?$,$"$j$^$9$G$7$g$&$+!)(B

$B$d$C$QL>A0$8$c$J$$$G$9$+$M$(!#5!G=$KH?BP$7$F$$$k?M$O>/$J$$$h$&$K;W$o$l$^$9!#(B

Feature #4043: $B%0%m!<%P%k4X?t(Bcurrent_class$B$NDs0F(B
Feature #4043: グローバル関数current_classの提案 - Ruby master - Ruby Issue Tracking System

$B$5$,$7$F$_$?$H$3$m(B Module.current
$B$GH?BP0U8+$O8+$D$+$i$J$$$h$&$G$9$7!"(B
$B8+$?5-21$b$J$$$G$9!#(B

$BL>A0!J$H$$$&$+Ds0FEv=i$O%0%m!<%P%k4X?t$K$9$k$3$H!K$rLdBj$K$5$l$?$N$O(B
$B$^$D$b$H$5$s$@$C$?$H;W$&$N$G$9$,!“(BModule $B$NFC0[%a%=%C%I(B
Module.current $B$G!”(B
$B2?$+LdBj$O$"$j$^$9$G$7$g$&$+!d$^$D$b$H$5$s(B