From: Akira Hayakawa <ruby / i-mail.jp>
Subject: [ruby-list:45440] Re: assert_equalの挙動について
Date: Sat, 30 Aug 2008 17:09:43 +0900

るびきちです。

> 納得しました。==は鬼門なんですね。

Rubyの==は同値性を判定することが期待されます。
ただ、デフォルトのObject#==の定義が同一性の判定になっているので、
適宜再定義してやる必要があります。

class Name
  attr_accessor :name
  
  def initialize(name)
    @name = name
  end
end

これは、

Name = Struct.new :name

と書き換えることができます。Structは構造体クラスで、オブジェクトを集積
するためのものです。
Struct#==はすべてのメンバが==であれば真になるように定義されています。

Name = Struct.new :name

n = Name.new "x"                # => #<struct Name name="x">
n2 = Name.new "x"
n == n2                         # => true

> > > Rubyではequal?がオブジェクトidの同一性を調べるもので、==がオブジェクトの値の一致を調べるものだとたのしいRubyのp.66に書いてあります。
> > > また、assert_equalは==ならパスする関数で、assert_sameはequal?ならパスする関数だと以下のリファレンスに書いてあります。

確かに名前が意味と食い違っているから混乱しがちですね。

「同じ」という言葉は同一性とも同値性とも取れるからタチが悪いです。
equalという言葉が言語によって同一性だったり同値性だったりしますし。

Lispの「equal」は同値性…
Scheme至ってはそのまんま「equal?」関数があって、そっちも同値性…

Lispから多くのものを取り入れているRubyが「equal」を同値性の意味にしなかっ
た理由を知りたいです。

--
rubikitch
Blog: http://d.hatena.ne.jp/rubikitch/
Site: http://www.rubyist.net/~rubikitch/