1

我正在尝试在 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

这是我运行它时得到的:

出了点问题... 结果[0]:#<TCPSocket:0x33c390>,服务器:#<TCPSocket:0x33c390>
ID:结果[0]:1695840,服务器:1695990

我在 Mac OS X 上运行 Ruby 1.8.6 版。

$红宝石--版本
ruby 1.8.6 (2008-03-03 patchlevel 114) [universal-darwin9.0]
$ 哪个红宝石
/usr/bin/红宝石
4

2 回答 2

7

select 返回的 Array 的第一个元素是准备好的 IO 对象的 Array。因此,您应该将 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 回答