--pgp-sign-Multipart_Sun_Sep_27_12:00:19_2009-1
Content-Type: text/plain; charset=ISO-2022-JP

 ここ数ヶ月私生活で忙しく、返事が遅れてしまいすみません。

At Sat, 12 Sep 2009 21:18:13 +0900,
Nobuhiro IMAI wrote:
> From: Nobuhiro IMAI <nov_at_yo.rim.or.jp>
> Date: Fri, 14 Aug 2009 21:19:42 +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アドレスなので、ネット
マスクの違いで等しくなくなるのはまずいです。

 その上で、ソートの便宜を考えて <=> についてはネットマスクを
見て a1 == a2 && (a1 <=> a2) != 0 というケースを許すというのも
なくはないと思いますが、ユースケースに見られるニーズを満たす
よりよい方法はほかにあると思います。


 まず、改めてAPIを見るとネットマスクを取る手段がないので、
#mask_addr や #prefixlen のようなメソッドを用意して
sort_by/max_by {|i| [i, i.mask_addr] } できるようにするのが
ひとつ。(これは本件に関係なく)

 もう一つは class NetAddr < IPAddr のようなサブクラスを作り、
そちらで == や <=> をオーバーライドする方法。

 両方やってもいいかもしれませんね。どうでしょうか。

--
Akinori MUSHA / http://akinori.org/

--pgp-sign-Multipart_Sun_Sep_27_12:00:19_2009-1
Content-Type: application/pgp-signature
Content-Transfer-Encoding: 7bit

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (FreeBSD)

iEYEABECAAYFAkq+1UMACgkQkgvvx5/Z4e43hQCfVhEKiXAsmZMHwNghClhVsPL7
qLgAoIiPh+ir/TBNJJJfqXp57anVz23j
=TXSd
-----END PGP SIGNATURE-----

--pgp-sign-Multipart_Sun_Sep_27_12:00:19_2009-1--