[#44725] Set[Set[1]]==Set[Set[1]] は偽? — "5.5" <5.5@...>

5.5 です。

22 messages 2008/03/04

[#44782] $stdin.rewind が exec した子プロセスに伝わらない? — SATOH Fumiyasu <fumiyas@...>

さとうふみやす @ OSS テクノロジです。

11 messages 2008/03/17
[#44783] Re: $stdin.rewind が exec した子プロセスに伝わらない? — Kazuhiro NISHIYAMA <zn@...> 2008/03/17

西山和広です。

[ruby-list:44743] Re: Set[Set[1]]==Set[Set[1]] は偽?

From: "5.5" <5.5@...>
Date: 2008-03-06 22:49:00 UTC
List: ruby-list #44743
5.5 です。

Tietew さん:
> eql? は、ハッシュのキーとして一致するかどうかを返すメソッドですから、
> Set(というか Hash)が eql? を使うのは正しいです。
> 
> 問題はそこではなく、Set[1].hash が毎回違う値を返すことなのですが、何故な
> のかというと、Hash がもともとハッシュのキーとして使われることを想定して
> いないからです。

なるほど。
もともとこのライブラリは,数学の集合をいかに表現するかという
ことより,ハッシュを利用していかに効率よく集合を実現するかと
いうことでできたものなのでしょうか。

ところで,Ruby 1.9.0 で試したら,ハッシュのハッシュ値が同じ
値を返すことに気づきました。何かが変わったんですね。

> 直したかったら、以下で直ります。
> ただし、遅くなります。
> 
> require 'set'
> class Set
>   def hash
>     @hash.keys.hash
>   end
>   def eql?(o)
>     o.is_a?(Set) && @hash.keys.eql?(o.instance_variable_get(:@hash).keys)
>   end
> end

ありがとうございました。やってみます。
どのくらい遅くなるのかとかも調べてみます。

-- 
5.5@moji.gr.jp


In This Thread