From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?=) Date: 2008-08-27T00:44:32+09:00 Subject: [ruby-dev:35991] Re: 1.9と1.8で、delegateのインスタンスのクラス名の違う けいじゅ@いしつかです. In [ruby-dev :35987 ] the message: "[ruby-dev:35987] Re: 1.9と1.8で、 delegateのインスタンスのクラス名の違う ", on Aug/26 23:32(JST) Yukihiro Matsumoto writes: >まつもと ゆきひろです >|ruby -rdelegate -e 'class MyClass|end;p MyClass.new([]).class' >|を実行すると、 >|1.8ではMyClassが返るのですが、 >|1.9ではArrayが返ってきます。 >| >|これは仕様でしょうか? >1.8と1.9の挙動が違うのは確かで、これを仕様とするのか、1.8の >挙動に戻すのか迷っている段階です。なかなか真剣に考える時間が >取れなくて。 私は今のまま(Ruby1.9の振る舞い)で良いと思います. もしくは, MyClassを返したいなら, * ancestorsが MyClass true となるようになっても良いかも. これだと, 限りなくArrayであって欲しいと 言うことと, MyClassのインスタンスであることの両者が成り立ちます. ただ, SimpleDelegatorは委譲先が固定でないので, 上記のようなancestorsの 振る舞いできないので, obj.class はやはり委譲先のクラスを返すしかないで しょうけど. もどって, 今のままの場合, 元のクラスを調べる(本当の自分を調べる)方法が ないので, 元のクラスを知る方法があっても良いと思います. delegetee_class とか? さらに, ついでにリクエストしますが, Module#=== の振る舞いを. class Module def ===(other) other.kind_of?(self) end end にしません? 今のままだと, case/whenで デレゲート先のクラスを指定できな くて不便です. また, case/whenを使っていてもデレーゲート先のオブジェク トと限りなく同じ振る舞いにできます. PS. delegatorがらみということで, [ruby-dev:35977] もよろしく. 分かりづらい 表現かも知れませんが, Ruby1.9の振る舞いを変えたらどうでしょう? と言っ ています. __ ---------------------------------------------------->> 石塚 圭樹 <<--- ---------------------------------->> e-mail: keiju@ishitsuka.com <<---