From: shugo@... (=?ISO-2022-JP?B?GyRCQTBFRBsoQiAbJEI9JDhjGyhC?= / maeda shugo) Date: 1997-08-30T23:57:41+09:00 Subject: [ruby-list:3987] Re: Object#id <=> Fixnum#id2object ? (Re: SyslogSendmail class) 前田です。 In message "[ruby-list:3986] Re: Object#id <=> Fixnum#id2object ? (Re: SyslogSendmail class)" 石塚圭樹 wrote: |以前, 良く問題になったのは, 上記の例のようにevalの中にclassがありその |中にevalの外の変数を使いたい時に良く苦労したんですが, instance_evalや |module_evalができたので, それを使えばほとんどの場合問題なくなるんじゃ |ないでしょうか? そうですね。 |でも, メソッド定義を行いたい時は問題ありか... | |baz = [0, 1, 2] |Foo.module_eval %q{ | def foo | #{baz.embed}.concat 3 | end |} | |に相当するものは実現できないですね... そうなんですよね、これがやりたくて困った覚えがあります。 # そんなことしたい時はそうそうないのであまり問題では # ないと思いますが。 Foo.define_method "foo", %{ # メソッド本体 } みたいなのがあればOKかなと思うのですが、以前検討されて いましたよね? 結局却下になったのかな。 |前田さんはObjectSpaceを使っていますが, 以下のような実装もありますね. |一度embedされたオブジェクトはGCされなくなるという問題がありますが, ま |あ, メソッド定義の時はGCされると困るので...(^^;;; | | class Object | Id2Object = {} | | def embed | Id2Object[id] = self | format("Id2Object[%d]", id) | end | end なるほどこちらの方が速そうですね。 -- 前田 修吾