[#950] ruby 1.1b0 released — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

33 messages 1997/12/05

[#998] ruby 1.1b1 released — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

48 messages 1997/12/09
[#1011] Re: ruby 1.1b1 released — Kazuhisa Yanagawa <katze@...> 1997/12/10

in message-id: <199712090833.RAA31727@picachu.netlab.co.jp>

[#1013] Re: ruby 1.1b1 released — matz@... (Yukihiro Matsumoto) 1997/12/10

まつもと ゆきひろです

[#1028] Regexp#operators (Re: ruby 1.1b1 released) — Shin-ichiro HARA <sinara@...> 1997/12/10

原です。

[#1030] Re: Regexp#operators (Re: ruby 1.1b1 released) — matz@... (Yukihiro Matsumoto) 1997/12/10

まつもと ゆきひろです

[#1033] Re: Regexp#operators (Re: ruby 1.1b1 released) — Shin-ichiro HARA <sinara@...> 1997/12/10

原です。

[#1049] Re: Regexp#operators (Re: ruby 1.1b1 released) — Shin-ichiro HARA <sinara@...> 1997/12/11

原です。

[#1064] Re: Regexp#operators (Re: ruby 1.1b1 released) — matz@... (Yukihiro Matsumoto) 1997/12/12

まつもと ゆきひろです

[#1097] Re: Regexp#operators (Re: ruby 1.1b1 released) — Shin-ichiro HARA <sinara@...> 1997/12/15

原です。

[#1002] Object#bind — shugo@... (Shugo Maeda)

前田です。

39 messages 1997/12/09
[#1008] Re: Object#bind — matz@... (Yukihiro Matsumoto) 1997/12/10

まつもと ゆきひろです

[#1023] Re: Object#bind — shugo@... (Shugo Maeda) 1997/12/10

前田です。

[#1026] Re: Object#bind — matz@... (Yukihiro Matsumoto) 1997/12/10

まつもと ゆきひろです

[#1044] Re: Object#bind — keiju@... (石塚圭樹 ) 1997/12/11

けいじゅ@日本ラショナルソフトウェアです.

[#1051] Re: Object#bind — shugo@... (Shugo Maeda) 1997/12/11

前田です。

[#1063] Re: Object#bind — matz@... (Yukihiro Matsumoto) 1997/12/12

まつもと ゆきひろです

[#1079] Re: Object#bind — keiju@... (石塚圭樹 ) 1997/12/14

けいじゅ@日本ラショナルソフトウェアです.

[#1084] Re: Object#bind — matz@... (Yukihiro Matsumoto) 1997/12/15

まつもと ゆきひろです

[#1087] Re: Object#bind — keiju@... (石塚圭樹 ) 1997/12/15

けいじゅ@日本ラショナルソフトウェアです.

[#1088] Re: Object#bind — matz@... (Yukihiro Matsumoto) 1997/12/15

まつもと ゆきひろです

[#1085] [Req] object refference — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

12 messages 1997/12/15

[ruby-dev:1142] Re: Object#bind

From: shugo@... (Shugo Maeda)
Date: 1997-12-18 07:18:51 UTC
List: ruby-dev #1142
前田です。

In message "[ruby-dev:1136] Re: Object#bind"
Yukihiro Matsumoto <matz@netlab.co.jp> wrote:

||# たしか, この話しの元になったのが
||#
||#   (fset 'old-func (symbol-funcation 'method)
||#   (defun method ...)
||#
||# をrubyでも行ないたいって話しでしたので...
|
|とはいえ,もともとの前田さんのBoundMethodの実装が今私の話し
|ているようなBoundMethodでしたからねえ.

混乱させてしまったようで,すみません。

|問題なのはmix-inの関係でrubyは実装上は多重継承になっているの
|でsuperで呼ばれるメソッドが静的には決して決まらないことです.
|で,現在はレシーバのクラス階層から動的に探しているのですが,
|UnboundMethodによってメソッドが要求するクラス階層とレシーバ
|のクラス階層が異なると破綻しそうです.すくなくとも現在の実装
|では対応できません.

UnboundMethodにそのメソッドが定義されていたクラスも持たせれば
よいのではないでしょうか?

struct UNBOUND_METHOD {
    VALUE class;
    ID id;
    NODE *body;
};

/* UnboundMethod#apply 第一引数をレシーバとしてメソッドを呼び出す */
static VALUE unboundmethod_apply(int argc, VALUE *argv, VALUE method)
{
    VALUE result, recv;
    struct UNBOUND_METHOD *data;
    enum node_type type;

    if (argc == 0) ArgError("wrong # arguments");
    recv = *argv;
    argc--; argv++;
    Data_Get_Struct(method, struct UNBOUND_METHOD, data);
    type = nd_type(data->body);
    PUSH_ITER(iterator_p()?ITER_PRE:ITER_NOT);
    result = rb_call0(data->class, recv, data->id, data->id,
		      argc, argv, 1, data->body, type);
    POP_ITER();
    return result;
}

# 実際に試してないので変なところがあるかもしれません。

クラスにUnboundMethodをメソッドとして追加する方は,ちょっと
姑息ですが,

class Module
  def add_method(name, method)
    unless name.kind_of? String
      name = name.id2name
    end
    module_eval %!
      UNBOUND_METHODS__ = {} unless defined? UNBOUND_METHODS__
      UNBOUND_METHODS__["#{name}"] = method
      def #{name}(*args)
        UNBOUND_METHODS__["#{name}"].apply(self, *args)
      end
    !
  end
end

などとすれば,うまくいくように思います。

-- 
前田 修吾

In This Thread