Feature #4043

グローバル関数current_classの提案

Added by Makoto Kishimoto almost 5 years ago. Updated about 3 years ago.

[ruby-dev:42564]
Status:Rejected
Priority:Normal
Assignee:Yukihiro Matsumoto

Description

=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

patch-cref (1020 Bytes) Makoto Kishimoto, 11/11/2010 12:50 PM

patch-current-class (2.17 KB) Makoto Kishimoto, 02/11/2011 05:53 PM

No4043.pdf - [ruby-dev:45708] コンペ向けの資料 (14.3 KB) Makoto Kishimoto, 06/24/2012 05:10 PM

History

#1 Updated by Yukihiro Matsumoto over 4 years ago

=begin
まつもと ゆきひろです

In message "Re: [Ruby 1.9-Feature#4043][Open] グローバル関数current_classの提案"
on Thu, 11 Nov 2010 12:50:42 +0900, Makoto Kishimoto redmine@ruby-lang.org writes:

|カレントクラス(MRIの内部でいうところのcref)をRubyから調べられるメソッドcurrent_classを提案します。
|グローバル関数(Kernelのプライベートメソッド)にする理由は、self(ないしなんらかのオブジェクト)とは関係ない値を返すメソッドであるため、です。

そういう機能の追加には賛成しますが、グローバル関数は増やした
くありません。どうするのがよいでしょうね。

=end

#2 Updated by Makoto Kishimoto over 4 years ago

=begin
きしもとです

|カレントクラス(MRIの内部でいうところのcref)をRubyから調べられるメソッドcurrent_classを提案します。
|グローバル関数(Kernelのプライベートメソッド)にする理由は、self(ないしなんらかのオブジェクト)とは関係ない値を返すメソッドであるため、です。

そういう機能の追加には賛成しますが、グローバル関数は増やした
くありません。どうするのがよいでしょうね。

さがしてみたところ、Module の特異メソッドに、レシーバとは関係ない、
現在のコンテキストについて動作するものがありました。

なので、Module の特異メソッドではどうでしょうか?

=end

#3 Updated by Yukihiro Matsumoto over 4 years ago

=begin
まつもと ゆきひろです

In message "Re: Re: [Ruby 1.9-Feature#4043][Open] グローバル関数current_classの提案"
on Tue, 21 Dec 2010 11:21:32 +0900, "KISHIMOTO, Makoto" ksmakoto@dd.iij4u.or.jp writes:

|> そういう機能の追加には賛成しますが、グローバル関数は増やした
|> くありません。どうするのがよいでしょうね。
|
|さがしてみたところ、Module の特異メソッドに、レシーバとは関係ない、
|現在のコンテキストについて動作するものがありました。
|
|なので、Module の特異メソッドではどうでしょうか?

その場合、Module.current_class という名前になるんですかね。

=end

#4 Updated by Makoto Kishimoto over 4 years ago

=begin
きしもとです

|> そういう機能の追加には賛成しますが、グローバル関数は増やした
|> くありません。どうするのがよいでしょうね。
|
|さがしてみたところ、Module の特異メソッドに、レシーバとは関係ない、
|現在のコンテキストについて動作するものがありました。
|
|なので、Module の特異メソッドではどうでしょうか?

その場合、Module.current_class という名前になるんですかね。

Module.current_module のほうがいいですね。Module を指すことがあること
とも一致します。

元々「メタプログラミングRuby」でそう呼んでるから、という理由だけで命名
してますので、そちらとズレる、というのが問題点と言えば言えそうです。

=end

#5 Updated by Yukihiro Matsumoto over 4 years ago

=begin
まつもと ゆきひろです

In message "Re: Re: [Ruby 1.9-Feature#4043][Open] グローバル関数current_classの提案"
on Tue, 21 Dec 2010 17:37:16 +0900, "KISHIMOTO, Makoto" ksmakoto@dd.iij4u.or.jp writes:

|> その場合、Module.current_class という名前になるんですかね。
|
|Module.current_module のほうがいいですね。Module を指すことがあること
|とも一致します。
|
|元々「メタプログラミングRuby」でそう呼んでるから、という理由だけで命名
|してますので、そちらとズレる、というのが問題点と言えば言えそうです。

current_moduleという名前なのにクラスを返すこともあるというの
はやや抵抗がありますね。current_classという別名を用意しても
良いのですが、他にアイディアはありませんかね。

=end

#6 Updated by Keiju Ishitsuka over 4 years ago

=begin
けいじゅ@いしつかです.

In the message: " Re: [Ruby
1.9-Feature#4043][Open] グローバル関数current_classの提案", on Dec/22
01:35(JST) Yukihiro Matsumoto writes:

まつもと ゆきひろです

current_moduleという名前なのにクラスを返すこともあるというの
はやや抵抗がありますね。current_classという別名を用意しても
良いのですが、他にアイディアはありませんかね。

モデリング界では,

descriptor

を使っています. instance との対語として使います. インスタンスがクラス
のインスタンスに限らないのでそのような呼び名が出てきたんだと思います.
まあ, 今回の理由と同じでは?

__
---------------------------------------------------->> 石塚 圭樹 <<---
---------------------------------->> e-mail: keiju@ishitsuka.com <<---

=end

#7 Updated by Motohiro KOSAKI over 4 years ago

=begin

current_moduleという名前なのにクラスを返すこともあるというの
はやや抵抗がありますね。current_classという別名を用意しても
良いのですが、他にアイディアはありませんかね。

モデリング界では,

descriptor

を使っています. instance との対語として使います. インスタンスがクラス
のインスタンスに限らないのでそのような呼び名が出てきたんだと思います.
まあ, 今回の理由と同じでは?

小崎です

個人的な経験ですが、descriptorという用語はUnixのファイルディスクリプタの
イメージがとても強いらしく違う意味で使おうとすると強い抵抗にあいました。今でも事情はあんまり変わっていないのではないかしらん

=end

#8 Updated by Usaku NAKAMURA over 4 years ago

=begin
こんにちは、なかむら(う)です。

In message " Re: [Ruby 1.9-Feature#4043][Open] グローバル関数current_classの提案"
on Dec.22,2010 09:37:33, kosaki.motohiro@gmail.com wrote:

個人的な経験ですが、descriptorという用語はUnixのファイルディスクリプタの
イメージがとても強いらしく違う意味で使おうとすると強い抵抗にあいました。今でも事情はあんまり変わっていないのではないかしらん

私はUnix界の人じゃないので抵抗感が薄いだけかもしれないですけ
ど、Moduleクラスの特異メソッドであるなら Module. が頭に毎回付
くわけなので、ファイルディスクリプタとは絶対に違うものだよ感
出まくりだから問題ないんじゃないでしょうか。

それでは。
--
U.Nakamura usa@garbagecollect.jp

=end

#9 Updated by Usaku NAKAMURA over 4 years ago

=begin
こんにちは、なかむら(う)です。

In message " Re: [Ruby 1.9-Feature#4043][Open] グローバル関数current_classの提案"
on Dec.22,2010 01:35:44, matz@ruby-lang.org wrote:

current_moduleという名前なのにクラスを返すこともあるというの
はやや抵抗がありますね。current_classという別名を用意しても
良いのですが、他にアイディアはありませんかね。

単に Module.current というのが真っ先に脳裏に浮かびました。
あまりに一般的に過ぎるかという気はするのですが、いちおう候補
に出しておきます。

それでは。
--
U.Nakamura usa@garbagecollect.jp

=end

#10 Updated by Masaya Tarui over 4 years ago

=begin
たるいです。

ユースケースがRubyの理解という事だし、どこの所属かを考えたら

RubyVM.current_class

が良かったりしませんか?
候補の一つとして。

--
樽家昌也(Masaya TARUI)
No Tool,No Life.

=end

#11 Updated by Yukihiro Matsumoto over 4 years ago

=begin
まつもと ゆきひろです

In message "Re: Re: [Ruby 1.9-Feature#4043][Open] グローバル関数current_classの提案"
on Wed, 22 Dec 2010 12:57:26 +0900, Masaya TARUI tarui@prx.jp writes:

|ユースケースがRubyの理解という事だし、どこの所属かを考えたら
|
|RubyVM.current_class
|
|が良かったりしませんか?
|候補の一つとして。

なんとなくRubyVMってのはVM固有の機能を保持してて欲しいと思い
ます。メソッドの定義先というのは個別のVMに依存する機能ではな
いわけで。

=end

#12 Updated by Masaya Tarui over 4 years ago

=begin
たるいです。

個人的にはRubyVMって一般的過ぎてもう少し抽象的なもの、つまり
「RubyのVMが持っているべき特徴」 を示すイメージなのですが、
あくまでYARVを指すことには変わりないという事ですね。

一つ、一般的な実行環境を示すモジュールを用意して幾つか要素をその中に
押し込めたい気がしますが、いまここでそれをいうのも大げさだと思うので、、

Module.current

に一票に変えておきます。

2010年12月22日13:28 Yukihiro Matsumoto matz@ruby-lang.org:

なんとなくRubyVMってのはVM固有の機能を保持してて欲しいと思い
ます。メソッドの定義先というのは個別のVMに依存する機能ではな
いわけで。

--
樽家昌也(Masaya TARUI)
No Tool,No Life.

=end

#13 Updated by Yukihiro Matsumoto over 4 years ago

=begin
まつもと ゆきひろです

In message "Re: Re: [Ruby 1.9-Feature#4043][Open] グローバル関数current_classの提案"
on Thu, 23 Dec 2010 12:36:51 +0900, Masaya TARUI tarui@prx.jp writes:

|個人的にはRubyVMって一般的過ぎてもう少し抽象的なもの、つまり
|「RubyのVMが持っているべき特徴」 を示すイメージなのですが、
|あくまでYARVを指すことには変わりないという事ですね。

そうですね。たとえばVMのないRuby実行環境もありえるわけで。

=end

#14 Updated by Makoto Kishimoto over 4 years ago

=begin
Module.current に +1

新しいパッチ作りました
=end

#15 Updated by Makoto Kishimoto over 3 years ago

きしもとです

この件、現状としては、現在のカレントクラス(cref)を返す、Module の
特異メソッド Module.current の提案、となっているつもりですが、
採用を妨げるものとしては何がありますでしょうか?

#16 Updated by Shyouhei Urabe over 3 years ago

Makoto Kishimoto wrote:

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

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

#17 Updated by Makoto Kishimoto over 3 years ago

きしもとです

On Wed, 15 Feb 2012 18:05:12 +0900
Shyouhei Urabe shyouhei@ruby-lang.org wrote:

Issue #4043 has been updated by Shyouhei Urabe.

Makoto Kishimoto wrote:

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

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

Feature #4043: グローバル関数current_classの提案
https://bugs.ruby-lang.org/issues/4043

さがしてみたところ Module.current で反対意見は見つからないようですし、
見た記憶もないです。

名前(というか提案当初はグローバル関数にすること)を問題にされたのは
まつもとさんだったと思うのですが、Module の特異メソッド Module.current で、
何か問題はありますでしょうか>まつもとさん

#18 Updated by Yusuke Endoh over 3 years ago

  • Status changed from Open to Assigned
  • Assignee set to Yukihiro Matsumoto

#19 Updated by Makoto Kishimoto about 3 years ago

コンペ向けの資料を添付

#20 Updated by Yusuke Endoh about 3 years ago

受け取りました。具体的なユースケースが書いてないので、そこでひっかかってしまうかも。
「まつもとさんは機能自体には賛成していて、名前の議論だけとなっている」と明示するとよいかも。

#21 Updated by Yusuke Endoh about 3 years ago

  • Status changed from Assigned to Rejected

きしもとさん

7/21 の開発者会議にて、残念ながらこの機能は不採択と判定されました。

以下の 3 つの理由によります。

  • 「Ruby の理解が進む」というユースケースは弱い

  • Module のクラスメソッドはいまいち (Module.nesting で後悔したそうです)

  • implementation detail なので他実装で同等に実装できないかもしれない

    • 具体的には mruby で困るらしい

Yusuke Endoh mame@tsg.ne.jp

Also available in: Atom PDF