[#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:44726] Re: Set[Set[1]]==Set[Set[1]] は偽?

From: "Ohto, Yasunori" <Yasunori.Ohto@...>
Date: 2008-03-05 01:36:39 UTC
List: ruby-list #44726
大戸です。

メールに指摘されている部分が実現できるように実装してみました ^_^;
classify その他のメソッドは実現していません m_ _m

Set を使う用途としては一階層の場合が多いように思います。
実際、私の場合、一階層のものしか使ったことがありませんでした。
このことから速さを優先したのではないかと考えられます。


------------------
require'Set'

class SuperSet <Set
  def initialize(elements=[])
    set= super
    elements.each{ |i| set.add(i) }
    return(set)
  end

  def SuperSet.[](*elements)
    return(SuperSet.new(elements))
  end

  def ==(set)
    set.each{ |i| include?(i) or return false }
    return true
  end

  def add(element)
    include?(element) or super(element)
  end

  def include?(element)
    each{ |i| i==element and return true }
    return false
  end

end

if($0==__FILE__)
  puts SuperSet[SuperSet[1]]==SuperSet[SuperSet[1]]
  puts SuperSet[SuperSet[1],SuperSet[1]].length
end

------------------
実行結果
true
1
------------------ 


-----Original Message-----
From: 5.5 [mailto:5.5@moji.gr.jp] 
Sent: Tuesday, March 04, 2008 11:21 PM
To: ruby mailing list
Subject: [ruby-list:44725] Set[Set[1]]==Set[Set[1]] は偽?

5.5 です。

set ライブラリについての疑問です。

Set[Set[1]]==Set[Set[1]] は false を返します。
これは,Set が要素の同一性の判定に eql? を使っており,Set#eql?
はハッシュ値の一致を見ているからですよね。
でも真を返してほしいです。

まったく同じ話ですが,Set[Set[1], Set[1]] で作った集合は要素数
が 2 になります。
でもこの集合は Set[Set[1]] と同じであってほしいです。

集合の要素が集合だったとき,その同一性の判定を Set#== でやるわ
けにはいかないのでしょうか。

現状の仕様がこうなっているのは何か理由があるのでしょうが,では
Set[Set[1]] と Set[Set[1]] が同一となるような同一性判定はどの
ようにすればよいでしょうか。


--
5.5@moji.gr.jp




In This Thread