池田孝志です。

Ayanosuke <aya / big.or.jp> 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