Один лайнер в Ruby для отображения подсказки, получения ввода и назначения переменной?
часто я обнаруживаю, что делаю следующее:
print "Input text: "
input = gets.strip
есть ли изящный способ сделать это в одну строку? Что-то вроде:
puts "Input text: #{input = gets.strip}"
проблема с этим заключается в том, что он ждет ввода перед отображением приглашения. Есть идеи?
7 ответов:
проверить highline:
require "highline/import" input = ask "Input text: "
Я думаю, что будет что-то вроде того, что предложил Марк-Андре, но зачем вводить целую тонну кода, когда вы можете просто определить двухстрочную функцию в верхней части любого сценария, который вы собираетесь использовать:
def prompt(*args) print(*args) gets end name = prompt "Input name: "
следуя примеру @Bryn:
def prompt(default, *args) print(*args) result = gets.strip return result.empty? ? default : result end
Я знаю, что этот вопрос старый, но я бы показал, что я использую в качестве стандартного метода для получения ввода.
require 'readline' def input(prompt="", newline=false) prompt += "\n" if newline Readline.readline(prompt, true).squeeze(" ").strip end
это действительно хорошо, потому что если пользователь добавляет странные пробелы в конце или в начале, он удалит их, и он сохраняет историю того, что они ввели в прошлом (измените
true
доfalse
чтобы он этого не делал.). И, еслиARGV
не пуст, тоgets
попытается прочитать из файла вARGV
, вместо того, чтобы получить вход. Плюс,Readline
is часть стандартной библиотеки Ruby, поэтому вам не нужно устанавливать какие-либо драгоценные камни. Кроме того, вы не можете перемещать курсор при использованииgets
, но вы можете сReadline
.и, я знаю, что метод не одна строка, но это когда вы называете его
name = input "What is your name? "
проблема с вашим предлагаемым решением заключается в том, что строка, подлежащая печати, не может быть построена до тех пор, пока вход не будет прочитан, разделен и назначен. Вы можете отделить каждую строку точкой с запятой:
$ ruby -e 'print "Input text: "; input=gets.strip; puts input' Input text: foo foo
нашел Inquirer драгоценный камень случайно, и мне это очень нравится, я нахожу его более аккуратным и простым в использовании, чем Highline, хотя ему не хватает проверки ввода самостоятельно.
Ваш пример можно написать такrequire 'inquirer' inputs = Ask.input 'Input text'