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

时间:2009-02-23 05:50:43

标签: ruby select sockets

我正在尝试在Ruby中使用select on STDIN和TCP套接字,但由于某种原因,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

这是我运行时得到的结果:

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

2 个答案:

答案 0 :(得分:7)

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

...
if results[0].include? STDIN
  ...
elsif results[0].include? server 
 ...
...

答案 1 :(得分:0)

如果你使用.equal,你会得到相同的结果吗?或.eql?

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

==可能会被子类覆盖,但.equal?不应该是。这里的主要问题实际上是为什么相同的对象,通过==与自身相比,返回false。您可能需要查看TCPSocket类的源或文档。