いまいです。

From: "Akinori MUSHA" <knu_at_iDaemons.org>
Date: Sun, 27 Sep 2009 12:00:48 +0900

>> > * アドレスが同じ場合、ネットマスク長が長い方が IPAddr として大きいとみ
>> >   なす(IPAddr#<=> で @mask_addr を考慮する)
>> > * <=> と Comparable により == は定義されるので、IPAddr#== は廃止する
>> >
>> > という [ruby-dev:39038] のパッチはどうでしょうか?

>> > IPAddr.new("192.168.2.0/24") == IPAddr.new("192.168.2.0/32")
>> >
>> > が true から false に変わるという仕様変更なのですが、どうでしょうか?
>>
>> というのがまずいでしょうか。
> 
>  これは受け入れられません。IPAddrはネットマスクも保持するため
> ネットワークも表現できますが、第一義はIPアドレスなので、ネット
> マスクの違いで等しくなくなるのはまずいです。

そうですか、分かりました。<=> の変更は取り下げます。

それはそれとして、<=> と include Comparable があれば == の定義は不要に
思えるのですが、== を明示的に定義する理由があれば教えてください。現状
では == の定義を全部消しても、動作は同じだと思います。

>  その上で、ソートの便宜を考えて <=> についてはネットマスクを
> 見て a1 == a2 && (a1 <=> a2) != 0 というケースを許すというのも
> なくはないと思いますが、ユースケースに見られるニーズを満たす
> よりよい方法はほかにあると思います。
> 
> 
>  まず、改めてAPIを見るとネットマスクを取る手段がないので、
> #mask_addr や #prefixlen のようなメソッドを用意して
> sort_by/max_by {|i| [i, i.mask_addr] } できるようにするのが
> ひとつ。(これは本件に関係なく)
> 
>  もう一つは class NetAddr < IPAddr のようなサブクラスを作り、
> そちらで == や <=> をオーバーライドする方法。
> 
>  両方やってもいいかもしれませんね。どうでしょうか。

こちらは時間を見つけてパッチを書ければいいなと思います。
--
Nobuhiro IMAI <nov / yo.rim.or.jp>
Key fingerprint = F39E D552 545D 7C64 D690  F644 5A15 746C BD8E 7106