Пример из документации можно объяснить как
Открыть 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
, что означает, что нечего читать из сокета (передача завершена).