Ответ 1
Отъезд highline:
require "highline/import"
input = ask "Input text: "
Часто я обнаруживаю, что делаю следующее:
print "Input text: "
input = gets.strip
Есть ли изящный способ сделать это в одной строке? Что-то вроде:
puts "Input text: #{input = gets.strip}"
Проблема заключается в том, что он ожидает ввода перед отображением подсказки. Любые идеи?
Отъезд highline:
require "highline/import"
input = ask "Input text: "
Я думаю, что с чем-то похожим на то, что предложил Марк-Андре, это то, что нужно сделать, но зачем вводить целую кучу кода, когда вы можете просто определить функцию из двух строк вверху любого script 're собираетесь использовать:
def prompt(*args)
print(*args)
gets
end
name = prompt "Input name: "
Один лайнер взломается. Изящный... ну не совсем.
input = [(print 'Name: '), gets.rstrip][1]
Следующее @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
является частью стандартной библиотеки 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'