Project

General

Profile

Actions

Feature #4043

closed

グローバル関数current_classの提案

Added by metanest (Makoto Kishimoto) over 13 years ago. Updated over 11 years ago.

Status:
Rejected
Target version:
[ruby-dev:42564]

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


Files

patch-cref (1020 Bytes) patch-cref metanest (Makoto Kishimoto), 11/11/2010 12:50 PM
patch-current-class (2.17 KB) patch-current-class metanest (Makoto Kishimoto), 02/11/2011 05:53 PM
No4043.pdf (14.3 KB) No4043.pdf [ruby-dev:45708] コンペ向けの資料 metanest (Makoto Kishimoto), 06/24/2012 05:10 PM
Actions #1

Updated by matz (Yukihiro Matsumoto) over 13 years ago

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

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

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

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

=end

Actions #2

Updated by metanest (Makoto Kishimoto) over 13 years ago

=begin
きしもとです

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

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

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

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

=end

Actions #3

Updated by matz (Yukihiro Matsumoto) over 13 years ago

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

In message "Re: [ruby-dev:42834] Re: [Ruby 1.9-Feature#4043][Open] グローバル関数current_classの提案"
on Tue, 21 Dec 2010 11:21:32 +0900, "KISHIMOTO, Makoto" writes:

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

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

=end

Actions #4

Updated by metanest (Makoto Kishimoto) over 13 years ago

=begin
きしもとです

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

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

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

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

=end

Actions #5

Updated by matz (Yukihiro Matsumoto) over 13 years ago

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

In message "Re: [ruby-dev:42838] Re: [Ruby 1.9-Feature#4043][Open] グローバル関数current_classの提案"
on Tue, 21 Dec 2010 17:37:16 +0900, "KISHIMOTO, Makoto" writes:

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

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

=end

Actions #6

Updated by keiju (Keiju Ishitsuka) over 13 years ago

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

In [ruby-dev:42845] the message: "[ruby-dev:42845] 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: <<---

=end

Actions #7

Updated by kosaki (Motohiro KOSAKI) over 13 years ago

=begin

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

モデリング界では,

descriptor

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

小崎です

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

=end

Actions #8

Updated by usa (Usaku NAKAMURA) over 13 years ago

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

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

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

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

それでは。

U.Nakamura

=end

Actions #9

Updated by usa (Usaku NAKAMURA) over 13 years ago

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

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

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

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

それでは。

U.Nakamura

=end

Actions #10

Updated by tarui (Masaya Tarui) over 13 years ago

=begin
たるいです。

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

RubyVM.current_class

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

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

=end

Actions #11

Updated by matz (Yukihiro Matsumoto) over 13 years ago

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

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

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

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

=end

Actions #12

Updated by tarui (Masaya Tarui) over 13 years ago

=begin
たるいです。

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

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

Module.current

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

2010年12月22日13:28 Yukihiro Matsumoto :

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

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

=end

Actions #13

Updated by matz (Yukihiro Matsumoto) over 13 years ago

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

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

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

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

=end

Actions #14

Updated by metanest (Makoto Kishimoto) about 13 years ago

=begin
Module.current に +1

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

Updated by metanest (Makoto Kishimoto) about 12 years ago

きしもとです

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

Updated by shyouhei (Shyouhei Urabe) about 12 years ago

Makoto Kishimoto wrote:

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

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

Updated by metanest (Makoto Kishimoto) about 12 years ago

きしもとです

On Wed, 15 Feb 2012 18:05:12 +0900
Shyouhei Urabe 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 で、
何か問題はありますでしょうか>まつもとさん

Updated by mame (Yusuke Endoh) about 12 years ago

  • Status changed from Open to Assigned
  • Assignee set to matz (Yukihiro Matsumoto)

Updated by metanest (Makoto Kishimoto) almost 12 years ago

[ruby-dev:45708] コンペ向けの資料を添付

Updated by mame (Yusuke Endoh) over 11 years ago

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

Updated by mame (Yusuke Endoh) over 11 years ago

  • Status changed from Assigned to Rejected

きしもとさん

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

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

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

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

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

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

--
Yusuke Endoh

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0