Подавить нулевой ответ от метода Ruby

Мне поручили изменить существующий скрипт Ruby, но мои знания Ruby в лучшем случае базовые... Мне нужно добавить метод для проверки того, открыт ли порт сервера. если это так, сценарий должен возобновить выполнение того, что он делает. если нет, он должен выйти.

Я применил следующий метод, взятый из Ruby. порт открыт:

def is_port_open?
  @host = "localhost"
  @port = "8080"
  begin
    Timeout::timeout(1) do
      begin
        s = TCPSocket.new(@host, @port)
        s.close
      rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
        return "port closed :("
      end
    end
  rescue Timeout::Error
  end
  return "problem with timeout?"
end

Этот метод работает хорошо, за исключением случаев, когда возвращается «ноль», если порт открыт. Как подавить любой вывод (если нет ошибки)?

Заранее спасибо!


person miitak    schedule 08.01.2015    source источник
comment
Мне кажется, что это всегда будет возвращать "problem with timeout?", если порт не закрыт. Что вы имеете в виду, говоря о возвращении nil?   -  person Ajedi32    schedule 08.01.2015
comment
Вам следует подумать об изменении имени метода. Соглашение о кодировании в Ruby заключается в том, что методы заканчиваются на ? вернет истинное или ложное значение, которое используется в условных операторах. Кто-то, не зная, что это возвращает строку, может попытаться использовать ее в условном операторе только для того, чтобы обнаружить, что она всегда проходит. (2 цента)   -  person Charles Caldwell    schedule 08.01.2015


Ответы (1)


Нужно ли вам только проверять условие (порт открыт):

require 'timeout'
require 'socket'

def is_port_open? host, port
  @host = host || "localhost"
  @port = port || "8080"
  begin
    Timeout::timeout(1) do
      begin
        s = TCPSocket.new(@host, @port)
        s.close
        return true # success
      rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
        return false # socket error 
      end 
    end 
  rescue Timeout::Error
  end 
  return false # timeout error
end

is_port_open? 'localhost', 8080
#⇒ true
is_port_open? 'localhost', 11111
#⇒ false

Теперь вам решать, что возвращать в случае ошибки и т. д. Обратите внимание, что другой вариант — позволить исключениям распространяться на вызывающую сторону. Эта функция будет намного короче, но вам нужно будет обрабатывать исключения в вызывающей программе.

person Aleksei Matiushkin    schedule 08.01.2015
comment
Спасибо! кажется, что моя первоначальная проблема заключалась в том, что я вызвал метод, используя puts... o.0 (и поэтому результат был распечатан). - person miitak; 09.01.2015