Почему Ruby "получает" включает закрытие новой строки?
Мне не нужна конечная новая строка, которую я получаю от gets
. Половину времени я забываю chomp
, и это боль в....
Почему он там?
Ответы
Ответ 1
Подобно puts
(который похож на него), он предназначен для работы с строками с использованием символа \n
.
gets
принимает необязательный аргумент, который используется для "разделения" ввода (или "только чтение до его поступления" ). По умолчанию используется специальная глобальная переменная $/
, которая по умолчанию содержит \n
.
gets
- довольно общий метод для потоков чтения и включает этот разделитель. Если он этого не сделает, части содержимого потока будут потеряны.
Ответ 2
var = gets.chomp
Это помещает все в одну строку для вас.
Ответ 3
Если вы посмотрите документацию IO#gets
, вы заметите, что метод принимает необязательный параметр sep
, который по умолчанию имеет значение $/
(разделитель входных данных). Вы можете разрешить разделение ввода на другие вещи, кроме строк новой строки, например. абзацы ( "разделитель нулевой длины читает ввод абзаца за раз (две последовательные строки новой строки во входных отдельных абзацах)" ):
>> gets('')
dsfasdf
fasfds
dsafadsf #=> "dsfasdf\nfasfds\n\n"
Ответ 4
С точки зрения производительности лучшим вопросом будет "почему я должен избавиться от него?". Это не большая стоимость, но под капотом вам приходится платить за то, что возвращается строка. В то время как у вас, возможно, никогда не было случая, когда вам это нужно, у вас наверняка было много случаев, когда вам было все равно - gets s; puts stuff() if s =~ /y/i
и т.д. В этих случаях вы увидите (крошечную, крошечную) производительность улучшение, а не прерывание.