我正在尝试在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
答案 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类的源或文档。