青山です。

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>