代码之家  ›  专栏  ›  技术社区  ›  Brian Campbell Dennis Williamson

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

  •  1
  • Brian Campbell Dennis Williamson  · 技术社区  · 15 年前

    我尝试在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
    2 回复  |  直到 15 年前
        1
  •  7
  •   jgre    15 年前

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

    ...
    if results[0].include? STDIN
      ...
    elsif results[0].include? server 
     ...
    ...
    
        2
  •  0
  •   Sarah Mei    15 年前

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

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

    ==可以被子类重写,但.equal?不应该是。这里的主要问题实际上是,为什么同一个对象通过==与自身进行比较时返回了false。您可能需要签出tcpsocket类的源代码或文档。