Почему Ruby's select не возвращает сокет? - PullRequest
1 голос
/ 23 февраля 2009

Я пытаюсь использовать select в STDIN и TCP-сокет в Ruby, но по какой-то причине значение, возвращаемое из 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

Я использую Ruby версии 1.8.6 на Mac OS X.

$ ruby --version
ruby 1.8.6 (2008-03-03 patchlevel 114) [universal-darwin9.0]
$ which ruby
/usr/bin/ruby

Ответы [ 2 ]

7 голосов
/ 23 февраля 2009

Первым элементом массива, возвращаемым методом select, является массив готовых объектов ввода-вывода. Поэтому вы должны сравнить STDIN и сервер с результатами [0] [0]. Или лучше проверить, есть ли сокет в результатах Array

...
if results[0].include? STDIN
  ...
elsif results[0].include? server 
 ...
...
0 голосов
/ 23 февраля 2009

Получаете ли вы те же результаты, если используете .equal? или .eql?

http://ruby -doc.org / ядро ​​/ классов / object.html # M000341

== может быть переопределено подклассами, но .equal? не должно быть. Главный вопрос здесь заключается в том, почему тот же объект, по сравнению с самим собой через ==, возвращает false. Возможно, вам понадобится проверить исходный код или документы класса TCPSocket.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...