From: Takashi Ikeda Date: 1999-11-04T01:23:06+09:00 Subject: [ruby-list:18358] Re: オブジェクトの非同一性判定 池田孝志です。 Ayanosuke writes: >  大体は大丈夫なんですが、<=>、=== あたりが良くわかりません。 a <=> b は a - b の符号を返してくる感じです。 返す値は if a == b 0 elsif a > b 正 else 負 end のように計算します。 === は、左辺によってまちまちです。 Object#=== は、== とおなじ Module#=== は、kind_of? Range#=== は、範囲内か Regexp#=== は、正規表現とのマッチ 他のクラスについても、どう実装するかによるようです。 if "x" === "x" then p "Object" end if String === "x" then p "Module" end if "a".."z" === "x" then p "Range" end if /.*/ === "x" then p "Regexp" end > foo.eql?(bar) オブジェクトの同一性をチェック foo と bar が同じオブジェクトを指しているか調べます。 [ruby-list:18310]でよいのではと思います。 > foo == bar 同値関係をチェック foo と bar が同値か調べます。指すオブジェクトが違っていても、 値が同じだ、と == メソッドが定義されていれば同値なんだ、とい うことになります。 …と思ったのですが、eql? はクラスによっては == に再定義され ていることがあります。オブジェクトの同一性をチェックするには、 equal? を使わないといけないようです… 例えば、以下は結果が違 います。 "a".eql?("a") "a".equal?("a") で、eql? と == が違う例としては、 {}.eql?({}) {} == {} > !foo fooの否定 > not foo fooの否定 優先順位が上の方が高いです。 詳しくはruby-man-*.tar.gzのsyntax.htmlを見て下さい。 以下の結果が、上のものだと意図しないものになります。 1) if !foo == 1 and bar == 0 2) if not foo == 1 and bar == 0 1') if ((!foo) == 1) and (bar == 0) 2') if (not (foo == 1)) and (bar == 0) -- 池田 孝志 cercine@kcn.ne.jp