青山です。 Fri, Apr 16, 1999 at 10:51:29PM +0900 において Shin-ichiro Hara さん曰く: > b = Object.new > def b.[](i); i+8; end > > とした場合、a[0] == b[0], a[1] == b[1] ですが、いくら > なんでも b が 8 と 9 を参照しているとは言い難い。そん > な事を言えば b は少なくとも全ての Fixnum を参照してい > ると言わなくてはならなくなる。 オブジェクトの比較の場合は id が必要ですね。 $ ruby -e ' a = [8.1, 9.1] b = Object.new def b.[](i); i+8.1; end p a[0], b[0], (a[0].id == b[0].id) p a[1], b[1], (a[1].id == b[1].id) ' 8.1 8.1 false 9.1 9.1 false で、+8 の場合に true になってしまうのは、整数だけは高速化の為に固定し た id を返すようになっているという実装上の都合による例外です。 通常は、b.[](i) が呼ばれた段階で i+8.1 が評価され、新たなオブジェクト が生成されます。これは、メソッドとして定義しているとかは関係なく、 i + 8.1 が評価された段階で新たなオブジェクトを生成するからです。 -- 青山 和光 Wakou Aoyama <wakou / fsinet.or.jp>