From: shugo@... (=?ISO-2022-JP?B?GyRCQTBFRBsoQiAbJEI9JDhjGyhC?= / maeda shugo) Date: 1997-08-30T14:39:50+09:00 Subject: [ruby-list:3981] Re: Object#id <=> Fixnum#id2object ? (Re: SyslogSendmail class) 前田です。 In message "[ruby-list:3975] Re: Object#id <=> Fixnum#id2object ? (Re: SyslogSendmail class)" Yukihiro Matsumoto wrote: ||そうすると以前お話が出ていたObject#stringifyが欲しくなってくる ||のですが、あれはボツになったのでしょうか? | |いまんとこ,オブジェクト<->文字列の交換にはmarshalを使ってね, |ということになっています. marshalをすっかり忘れていました。 marshalを使えば、stringifyも定義できますね。 require "marshal" class Object def stringify format("Marshal.load('%s')", Marshal.dump(self)) end end Foo = Class.new bar = [0, 1, 2] eval("class Foo; BAR = #{bar.stringify}; end") p Foo::BAR # => [0, 1, 2] p bar.equal? Foo::BAR # => FALSE ちょっとインチキ臭いような...。 ||foo.equal? Foo::BAR || ||はFALSEになります? | |FALSEになるでしょうね. marshalを使ってもFALSEになりますね。(当たり前ですが) オブジェクトをそのまま渡したいと思ったら、やはり無理矢理 でもid使うぐらいしかないでしょうか? module ObjectSpace def search_id(id) each_object { |obj| if obj.id == id return obj end } end module_function :search_id end class Object def embed format("ObjectSpace.search_id(%d)", self.id) end end Foo = Class.new baz = [0, 1, 2] eval("class Foo; BAZ = #{baz.embed}; end") p Foo::BAZ # => [0, 1, 2] p baz.equal? Foo::BAZ # => TRUE # もちろんこの例ならFoo.const_set("BAZ", foo)で済みますが。 -- 前田 修吾