2009-02-23 21 views
1

我想在STDIN上使用select和在Ruby中使用TCP套接字,但由於某些原因,從select返回的值似乎永遠不匹配其中的一個選項;它看起來像是被返回的套接字,但它不匹配使用==(或等於?)。誰能告訴我爲什麼從select返回的結果與我傳入的對象不匹配,以及我應該在這裏做些什麼改變?爲什麼Ruby的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

回答

7

select返回的Array的第一個元素是已準備好的IO對象的Array。所以你應該比較STDIN和服務器的結果[0] [0]。或者更好的檢查一下,如果插座是在結果數組中

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

是的,就是這樣。我想我錯過了結果是一個數組數組;令人困惑的是,在我的調試語句中,數組的打印方式與單個套接字完全相同。 我結束了循環遍歷結果[0]中的元素而不是使用include?,但你的回答讓我開始了。謝謝! – 2009-02-23 15:57:24

0

你得到相同的結果如果你使用.equal?或.eql?

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

==子類可重寫,但.equal?不應該是。這裏的主要問題實際上是爲什麼當通過==比較自身時,同一個對象返回false。您可能需要查看TCPSocket類的源代碼或文檔。

+0

與.equal相同的結果?如果我嘗試打印每個對象的__id__,它們是不同的: puts「IDs:results [0]:#{results [0] .__ id__},server:#{server .__ id__}」 給我:` ID:results [0]:1695840,server:1695990` – 2009-02-23 06:12:29

相關問題