Что означает "line = s.gets" в этом примере сокета? - PullRequest
0 голосов
/ 28 сентября 2018
require 'socket'

s = TCPSocket.new('localhost', 2000)

while line = s.gets # Read lines from socket
  puts line         # and print them
end

s.close             # close socket when done

Я новичок в Ruby и сокетах в целом;Я получил этот код со страницы документации по Ruby Sockets в качестве одного из примеров.Я все понимаю, кроме фрагмента line = s.gets.Когда метод get вызывается, он получает ввод или это метод класса Socket?Может ли кто-нибудь дать мне объяснение?Спасибо!

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018
s = TCPSocket.new 'localhost', 2000 # Opens a TCP connection to host


while line = s.gets # Read the socket like you read any IO object.
                    # If s.gets is nil the while loop is broken
      puts line     # Print the object (String or Hash or an object ...)
end

Это как:

Клиентская сторона

#Init connection
   Client.send("Hello") #The client send the message over socket(TCP/IP)
#Close connection

Серверная сторона

#Init connection
    while line = s.gets # The client get the message sended by the client and store it in the variable line

        puts line  # => Hello
    end
#Close connection
0 голосов
/ 28 сентября 2018

Пример из документации можно объяснить как

Открыть TCP-сокет для localhost, порт 2000.

Читать из него построчно;при чтении распечатайте прочитанное.

Если для чтения не осталось содержимого, закройте сокет.

По сути, я думаю, что все выражение

while line = s.gets
  puts line
end

может вводить в заблуждение новичков в Ruby.

Приведенный выше фрагмент кода считывает содержимое из сокета s методом gets.Этот метод возвращает «строку» (строку), включая завершающий символ \n.Этот результат присваивается переменной line.

line = s.gets выражение не является сравнением, как может показаться;это назначение.Каждое назначение в Ruby возвращает значение, которое присваивается.Таким образом, результатом этой операции является строка, возвращаемая gets.

При оценке с помощью оператора while строка преобразуется в boolean.Любая строка, даже пустая, рассматривается как true, поэтому выполняется блок с puts line.

Поскольку это цикл while, он будет повторяться снова и снова, до getsметод возвращает nil, что означает, что нечего читать из сокета (передача завершена).

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