福嶋です。 Toshihiko SHIMOKAWA / 下川俊彦 <toshi / csce.kyushu-u.ac.jp> wrote: > 現在 UDPsocket#recvfrom は > > [ 受信文字列, [ 送信元ホスト, 送信元ポート]] > > という配列を返します。ここで、「送信元ホスト」は DNS を逆引きした結果の > そこで、UDPsocket#recvfrom の返り値を、TCPsocket#recvfrom に合わせて、 > > [ 受信文字列, 相手ソケットアドレス] > ただし「相手ソケットアドレス」の形式は IPsocket#addr > > に変更してはどうかという案があります。 前から思っていたのですが、この種の返り値は Struct を使って表すと いうのはどうでしょうか。 Struct.new('UDPRecv', :data, :addr) # data => 受信文字列 # addr => 相手ソケットアドレス こうすれば、今後変更があった時にも、既存のコードへの影響が少ない ですし、コードの可読性も上がるように思います。 また、互換性にこだわるなら以下のようにするのも手じゃないかと。 Struct.new('UDPRecv', :data, :src, :addr) # data => 受信文字列 # src => [ 送信元ホスト, 送信元ポート] # addr => 相手ソケットアドレス これだと、以下のように既存の API を使ったコードと新しい API を使っ たコードが共存できるのではないでしょうか。 data = aUDPsocket.recvfrom[0] host = aUDPsocket.recvfrom[1][0] port = aUDPsocket.recvfrom[1][1] addr = aUDPsocket.recvfrom.addr --- 福嶋正機