Один лайнер в 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, вместо того, чтобы получить вход. Плюс,Readlineis часть стандартной библиотеки 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'