Часто я делаю следующее:
print "Input text: "
input = gets.strip
Есть ли изящный способ сделать это в одну строку? Что-то вроде:
puts "Input text: #{input = gets.strip}"
Проблема заключается в том, что он ожидает ввода перед отображением приглашения. Есть идеи?
Ответы:
Ознакомьтесь с Highline :
require "highline/import" input = ask "Input text: "
источник
Я думаю, что пойти с чем-то вроде того, что предложил Марк-Андре, будет лучшим вариантом, но зачем вводить целую тонну кода, когда вы можете просто определить двухстрочную функцию в верхней части любого сценария, который вы собираетесь использовать :
def prompt(*args) print(*args) gets end name = prompt "Input name: "
источник
.chomp
метод после того, как вgets
противном случае переменная будет содержать\n
символ новой строки в конце.Один лайнер обязательно взломать. Изящно ... ну не совсем так.
input = [(print 'Name: '), gets.rstrip][1]
источник
input = (print 'Name: '; gets.rstrip)
читабельнее. Но у обоих решений есть проблемы сnil
ценностями. В Ruby 2.3 с ними можно изящно справитьсяinput = (print 'Name: '; gets&.rstrip)
.Я знаю, что это старый вопрос, но мне хотелось бы показать, что я использую в качестве стандартного метода ввода данных.
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? "
источник
Readline::readline
] завершает работу интерпретатора ruby и не возвращает статус терминала после того, как пользователь нажал '^ C' при ожидании ввода строки».highline/import
Следуя примеру @Bryn:
def prompt(default, *args) print(*args) result = gets.strip return result.empty? ? default : result end
источник
Проблема с предложенным вами решением заключается в том, что строка для печати не может быть построена до тех пор, пока ввод не будет считан, удален и назначен. Вы можете разделить каждую строку точкой с запятой:
$ ruby -e 'print "Input text: "; input=gets.strip; puts input' Input text: foo foo
источник
Я случайно нашел жемчужину Inquirer , и она мне очень нравится, я считаю ее более простой и удобной в использовании, чем Highline, хотя она и не имеет собственной проверки ввода.
Ваш пример можно записать так
require 'inquirer' inputs = Ask.input 'Input text'
источник