From: Nobuhiro IMAI Date: 2009-10-04T13:40:10+09:00 Subject: [ruby-dev:39430] Re: [Feature:1.9] How about IPAddr#<=> to take care of mask_addr? いまいです。 From: "Akinori MUSHA" 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 Key fingerprint = F39E D552 545D 7C64 D690 F644 5A15 746C BD8E 7106