Мне никогда не нужна конечная новая строка, которую я получаю от gets
. Половину времени я забываю chomp
об этом, и это заноза в сердце....
Почему это там?
Мне никогда не нужна конечная новая строка, которую я получаю от gets
. Половину времени я забываю chomp
об этом, и это заноза в сердце....
Почему это там?
Как и puts
(звучит похоже), он предназначен для работы со строками с использованием символа \n
.
gets
принимает необязательный аргумент, который используется для «разделения» ввода (или «просто чтения до его поступления»). По умолчанию используется специальная глобальная переменная $/
, которая по умолчанию содержит \n
.
gets
— довольно общий метод для чтения потоков и включает этот разделитель. Если бы он этого не делал, части содержимого потока были бы потеряны.
var = gets.chomp
Это помещает все это в одну строку для вас.
Если вы посмотрите на документацию IO#gets
, вы заметите, что метод принимает необязательный параметр sep
, который по умолчанию равен $/
(разделитель входных записей). Вы можете разделить ввод на другие вещи, кроме новых строк, например. параграфы ("разделитель нулевой длины считывает ввод по абзацу за раз (два последовательных символа новой строки во входных отдельных абзацах)"):
>> gets('')
dsfasdf
fasfds
dsafadsf #=> "dsfasdf\nfasfds\n\n"
"1,2,3".split(',')
не возвращает запятые. Я бы сказал (как и в своем ответе), что причина несоответствия заключается в том, что нет никакой дополнительной работы, чтобы убрать запятые из результата для split
, но gets
должен буферизовать разделитель записей, прежде чем он сможет заметить, что он пришел вдоль.
- person Coderer; 22.06.2011
IO#gets
используется и в других контекстах, в некоторых из которых удаление разделителя может показаться не таким естественным, как при непосредственном запросе пользовательского ввода.
- person Michael Kohl; 22.06.2011
С точки зрения производительности лучшим вопросом было бы «почему я должен избавиться от него?». Это не большая стоимость, но под капотом вы должны заплатить за то, чтобы перегрызть возвращаемую строку. Хотя у вас, возможно, никогда не было случая, когда вам это нужно, у вас наверняка было много случаев, когда вам было все равно -- gets s; puts stuff() if s =~ /y/i
и т. д. В этих случаях вы увидите ( крошечный, крошечный) улучшение производительности за счет отсутствия пережевывания.
gets
— это стандартный метод во многих языках, уходящий своими корнями в C. Его поведение такое же, как и в C, что, вероятно, связано с согласованностью. Я сомневаюсь, что это изменится, поэтому вы, вероятно, захотите привыкнуть либо к автоматическому добавлениюchomp
, либо уделять больше внимания нужному вам типу данных и добавлятьchomp
только при необходимости. Это просто одна из тех задач в программировании, которым мы учимся. - person the Tin Man   schedule 29.12.2013