我尝试在 STDIN 上使用 select 并在 Ruby 中使用 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
最佳答案
select 返回的 Array 的第一个元素是准备好的 IO 对象的 Array。因此,您应该将 STDIN 和服务器与结果 [0][0] 进行比较。或者更好地检查,如果套接字在结果数组中
...
if results[0].include? STDIN
...
elsif results[0].include? server
...
...
关于ruby - 为什么 Ruby 的 select 不返回套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/576628/