--pgp-sign-Multipart_Mon_Sep_28_20:38:56_2009-1
Content-Type: text/plain; charset=ISO-2022-JP

At Mon, 28 Sep 2009 10:26:18 +0900,
Kazuhiro NISHIYAMA wrote:
> At Sun, 27 Sep 2009 12:00:48 +0900,
> Akinori MUSHA wrote:
> >
> >  これは受け入れられません。IPAddrはネットマスクも保持するため
> > ネットワークも表現できますが、第一義はIPアドレスなので、ネット
> > マスクの違いで等しくなくなるのはまずいです。
>
> ネットマスクで思い出したのですが、
>
>  IPAddr.new("192.168.0.1/24") #=> #<IPAddr: IPv4:192.168.0.0/255.255.255.0>
>  IPAddr.new("192.168.0.2/24") #=> #<IPAddr: IPv4:192.168.0.0/255.255.255.0>
>
> のようにネットマスクがあるとnewの引数の文字列よりも情報が減ってしまって
> 別途元のIPアドレスを持っておかないといけないのが不便です。

 これはど忘れしていました。ネットマスクを指定すると mask! されて
ネットワークアドレスになるんですね。(というかすべてがネットワーク
アドレスで、フルビットマスクによって単一のIPアドレスを表す)

 とすれば == の変更はリーズナブルとも言えますが、互換性を失うこと
にはやはり抵抗を覚えます。

 次のようなAPIの改修方針はどうでしょうか。

IPAddr.new(addr_with_netmask)	# / を含む文字列

で生成されたインスタンスについては内部でフラグを立て、 netmask に
依らない比較を含め従来通りに振る舞うようにします。

 その上でこの用法は段階的に警告〜廃止し、新設する

IPAddr.parse(addr_with_netmask)	# / を含む文字列
IPAddr.new(addr, netmask)	# ネットマスクは第2引数で指定

への移行を促します。

 こうすると、新たに「フルビットでないネットマスクを指定された
IPアドレス」という新種のインスタンスが加わることになるので、
等価性や大小関係を含む任意の演算について新しい定義を導入できる
ようになります。

 ただの思いつきですが、ひとつの材料としていただければ。

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

--pgp-sign-Multipart_Mon_Sep_28_20:38:56_2009-1
Content-Type: application/pgp-signature
Content-Transfer-Encoding: 7bit

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

iEYEABECAAYFAkrAoFEACgkQkgvvx5/Z4e6w+wCcD0ipzv32MwrgXgCyJ+hr7Jwr
S7EAnjzzRfQgJVJIOlzXWnsjJlBD/pp2
=v50Q
-----END PGP SIGNATURE-----

--pgp-sign-Multipart_Mon_Sep_28_20:38:56_2009-1--