1

Ruby で STDIN と TCP ソケットで select を使用しようとしていますが、何らかの理由で、select から返される値が選択肢の 1 つと一致しないようです。返されているのはソケットのように見えますが、== (または等号?) を使用して一致しません。select から返された結果が、渡したオブジェクトと一致しない理由と、ここで何をすべきか教えてもらえますか?

server = TCPSocket::new("irc.freenode.net", 7000)
server.puts "NICK MyBot"
server.puts "USER #{ENV['USER']} 0 * :My Bot"

# <snip definitions>

while (!$done)
  results = select([server, STDIN], nil, nil)
  if results[0] == STDIN
    puts "Reading from STDIN"
    execute_command
  elsif results[0] == server
    puts "Reading from server"
    receive_data
  else
    puts "Something's wrong... results[0]: #{results[0]}, server: #{server}"
    puts "IDs: results[0]: #{results[0].__id__}, server: #{server.__id__}"
    exit 1
  end
end

これを実行すると、次のようになります。

何かがおかしい... 結果[0]: #<TCPSocket:0x33c390>、サーバー: #<TCPSocket:0x33c390>
ID: 結果[0]: 1695840、サーバー: 1695990

Mac OS X で Ruby バージョン 1.8.6 を実行しています。

$ ruby​​ --バージョン
ruby 1.8.6 (2008-03-03 パッチレベル 114) [universal-darwin9.0]
$どのルビ
/usr/bin/ルビー
4

2 に答える 2

7

select によって返される配列の最初の要素は、準備ができている IO オブジェクトの配列です。したがって、STDIN とサーバーを results[0][0] と比較する必要があります。または、ソケットが結果配列にあるかどうかを確認することをお勧めします

...
if results[0].include? STDIN
  ...
elsif results[0].include? server 
 ...
...
于 2009-02-23T08:10:15.657 に答える
0

.equal を使用しても同じ結果が得られますか? または.eql?

http://ruby-doc.org/core/classes/Object.html#M000341

== はサブクラスによってオーバーライドされる場合がありますが、.equal? あるべきではありません。ここでの主な問題は、実際には、同じオブジェクトが == を介してそれ自体と比較したときに false を返す理由です。TCPSocket クラスのソースまたはドキュメントを確認する必要がある場合があります。

于 2009-02-23T06:06:49.493 に答える