From: Tanaka Akira Date: 2003-02-04T13:18:28+09:00 Subject: [ruby-dev:19477] Re: equality between "a" and Exception.new("a") In article <1044331431.138035.28173.nullmailer@picachu.netlab.jp>, matz@ruby-lang.org (Yukihiro Matsumoto) writes: > え、URIは後者を仮定してるんですか。 def ==(oth) if oth.kind_of?(String) oth = URI.parse(oth) end if self.class == oth.class self.normalize.component_ary == oth.normalize.component_ary else false end end という感じですね。最初の if が後者を仮定していると私が感じるところです。 > 私の書き方が悪かったかな。先程の文章では > > 前者 > > ==は右辺をto_strやto_aryで変換しない > > 後者 > > to_strやto_aryを定義したクラスは==の比較で失敗する前に自分 > 自身をto_strやto_aryで変換してから比較してみる(というルー > ルを今後設定する) > > という意味だったんですけど。 そう理解しています。そして、URI はほぼ後者の立場をとっているといってい いと思います。まぁ、String に変換して比較するのでなく URI に変換して比 較するのがちょっと違いますが。 > URIが仮定して一貫性が崩れているものって、この場合なんですか。 URI は String#== は引数を to_ary で変換することを仮定して、交換律が成 り立つようにしてある、ということです。 > 問題は > > String#==やArray#==は右辺に対してto_strやto_aryを適用する > ため、交換則が成立しない場合がある。 > > だと思っていました。で、上記のふたつの対応法のいずれかがあり、 > 私は前者が良いだろうと思った、というのが私に取っての現状なの > ですが、「今、問題が起きはじめたので直したほうが」という「問 > 題」と「直す」は私の考えているものとは違うものなのでしょうか。 私も前者が良いと思います。 が、すでに、URI という後者を仮定して == にトリックをいれて交換律を成り 立たせていたものが存在し、その仮定が崩れたために URI と String の交換 律が壊れたというのがここでいう問題です。 結局のところ話は単純で、3行消してはどうか、というだけのことなんですが。 -- [田中 哲][たなか あきら][Tanaka Akira]