为什么Ruby的选择不返回套接字?

Bri*_*ell 1 ruby sockets select

我试图在Ruby上使用STDIN和TCP套接字上的select,但由于某种原因,select返回的值似乎永远不会匹配其中一个选项; 它看起来像是被返回的套接字,但它使用==(或等于?)不匹配.任何人都可以告诉我为什么从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
Run Code Online (Sandbox Code Playgroud)

这是我运行时得到的:

Something's wrong... results[0]: #<TCPSocket:0x33c390>, server: #<TCPSocket:0x33c390>
IDs: results[0]: 1695840, server: 1695990

我在Mac OS X上运行Ruby版本1.8.6.

$ ruby --version
ruby 1.8.6 (2008-03-03 patchlevel 114) [universal-darwin9.0]
$ which ruby
/usr/bin/ruby

jgr*_*gre 7

select返回的Array的第一个元素是一个准备就绪的IO对象的数组.所以你应该将STDIN和服务器与结果[0] [0]进行比较.或者更好的检查,如果套接字在结果数组中

...
if results[0].include? STDIN
  ...
elsif results[0].include? server 
 ...
...
Run Code Online (Sandbox Code Playgroud)