Посмотрев на этот вопрос, у меня есть следующий код:
$/ = "\0"
answer = STDIN.gets
Теперь я надеялся, что это позволит пользователю:
- введите многострочный ввод, завершив его нажатием Ctrl-D .
- введите однострочный ввод, оканчивающийся нажатием Ctrl-D .
- введите «ничего», заканчивая нажатием Ctrl-D .
Однако поведение, которое я на самом деле вижу, таково:
- Пользователь может ввести штраф в несколько строк.
- Пользователь может не ввести однострочный ввод, , если не нажмет Ctrl-D дважды .
- Пользователь может ввести «ничего», если он сразу нажмет Ctrl-D .
Итак, почему для однострочной ситуации (т. Е. Если пользователь ввел некоторый текст, но без новой строки, а затем нажал Ctrl-D ) требуется два нажатия Ctrl-D ? И почему тогда это работает, если пользователь ничего не вводит? (Я заметил, что если они ничего не вводят и нажимают Ctrl-D , я получаю не пустую строку, а класс nil - я обнаружил это при попытке вызвать .empty?
для результата, так как вдруг ужасно потерпел неудачу. Если есть способ заставить его возвращать и пустую строку, это было бы неплохо. Я предпочитаю проверять .empty?
на ==
, и не особо хочу определять .empty?
для ноля класс.)
РЕДАКТИРОВАТЬ : Поскольку я действительно хотел бы знать «правильный способ» сделать это в Ruby, я предлагаю вознаграждение в 200 повторений. Я также приму ответы, которые дают другой способ ввода терминального многострочного ввода с разумной процедурой «отправки» - я буду судить о «подходящем». Например, в настоящее время мы используем два символа "\ n", но это не подходит, поскольку оно блокирует абзацы и не интуитивно понятно.