From: Akinori MUSHA Date: 2009-09-27T12:00:48+09:00 Subject: [ruby-dev:39381] Re: [Feature:1.9] How about IPAddr#<=> to take care of mask_addr? --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 > 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--