Ruby言語やLinuxのネタが多いです。
August 08, 2003 [おもひで]
■ [Ruby-GNOME2] Ruby/GtkHtml2
とうとう、CVSにチェックインされちゃいました...。でも武井さん作のものではなく、Martin Povoln???(文字化け(^^;))によるものです。直接ruby-gnome2-devel-en MLにポストされたので断れませんでした。ごめんちゃい。
■ [Ruby-GNOME2] そろそろリリース準備するか....
なぜか、先行で予告リリースされてるし.....。誰だよ、一体。プレッシャーかけやがって....(T_T)。
■ [Misc] 今日はまつもとさんを囲む会か...
参加できず残念、っと思ってたら、偶然、さかいさんが都内に来ると言うことで、一緒に食事をすることに。楽しかったですYO!
....ってか一方的に私がしゃべりまくりだったような....(汗。
■ でも、次回はまつもとさんを囲む会の方に参加したいですね>さかいさん(^^;)
■ [Ruby] 「あるオブジェクトと別のオブジェクトが、同じかそうでないか判定できない」という例が思い浮かびません。
ツッコもうと思ったけど、量が多かったのでこちらに書きます。
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。

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