よたらぼ
自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。

August 08, 2003 [おもひで]

[Ruby-GNOME2] Ruby/GtkHtml2

とうとう、CVSにチェックインされちゃいました...。でも武井さん作のものではなく、Martin Povoln???(文字化け(^^;))によるものです。直接ruby-gnome2-devel-en MLにポストされたので断れませんでした。ごめんちゃい。

[Ruby-GNOME2] そろそろリリース準備するか....

なぜか、先行で予告リリースされてるし.....。誰だよ、一体。プレッシャーかけやがって....(T_T)。

[Misc] 今日はまつもとさんを囲む会か...

参加できず残念、っと思ってたら、偶然、さかいさんが都内に来ると言うことで、一緒に食事をすることに。楽しかったですYO!

....ってか一方的に私がしゃべりまくりだったような....(汗。

でも、次回はまつもとさんを囲む会の方に参加したいですね>さかいさん(^^;)

class Person
   def initialize(name)
      @name = name
   end
end
                                                                                
obj1 = Person.new("Masao")
obj2 = Person.new("Masao")
                                                                                
p obj1 == obj2  #(1)

この例ではobj1, obj2が同一なのでしょうか。それとも違うのでしょうか...。違います((1)でfalseが返る)。って、この例では当たり前に感じるかもしれません。

では、一体、どういう状態が等しい状態と言えるのでしょうか?

等しい状態というのはそのクラスによって条件が異なります。その条件を定義してあげない限り等しくなりません。

#実際はObjectクラスで条件が定義されているので、そのサブクラスである全てのオブジェクトはデフォルトでその条件に従います。

そこで、そのような条件をクラス毎に指定します。例えば、上の例で、「nameが等しい場合は同一のオブジェクト」と定義してみると例えば以下のようなコードになります。

#eql?とhashをオーバーライドすることもありますが、ここでは==だけ。詳しくはこちら

class Person
   attr_reader :name
   def initialize(name)
      @name = name
   end
   def ==(other)
      @name == other.name
   end
end
                                                                                
obj1 = Person.new("Masao")
obj2 = Person.new("Masao")
                                                                                
p obj1 == obj2

この場合、trueが返ります。つまり、このPersonクラスのインスタンスの同一性というのはPersonクラス自身に決めさせることができます。

同様に、Fixnumの場合は、そのインスタンスが持つ数値が同じならばtrueを返すようになっているだけです。

mputさんの言葉を借りて表現すると「Ruby において同じ値の Fixnum インスタンス同士は”完全に違う”」、「即値の 1 と 2-1 の計算結果は全く違うオブジェクト」なわけです。違うのだけど、そのままでは「(インスタンスとしては)同一でないにもかかわらず(クラスで等しいという条件に一致しているため)それが判定できない」わけです。

というのが、私の理解です。間違えてたらご指摘してくださると勉強になりますですm(__)m。

本日のツッコミ(全1件) [ツッコミを入れる]
mput (August 09, 2003 06:15)

いいえ、 Fixnum のインスタンスは id まで含めて完全に同一ですよ。
 % ruby -e'p 1.id, (2-1).id'
 3
 3
うちのサイトの例も eql? じゃなくて equal? を使えばよかったか。


編集