Один лайнер в Ruby для отображения подсказки, ввода ввода и назначения переменной?

Часто я обнаруживаю, что делаю следующее:

print "Input text: "
input = gets.strip

Есть ли изящный способ сделать это в одной строке? Что-то вроде:

puts "Input text: #{input = gets.strip}"

Проблема заключается в том, что он ожидает ввода перед отображением подсказки. Любые идеи?

Ответ 1

Отъезд highline:

require "highline/import"
input = ask "Input text: "

Ответ 2

Я думаю, что с чем-то похожим на то, что предложил Марк-Андре, это то, что нужно сделать, но зачем вводить целую кучу кода, когда вы можете просто определить функцию из двух строк вверху любого script 're собираетесь использовать:

def prompt(*args)
    print(*args)
    gets
end

name = prompt "Input name: "

Ответ 3

Один лайнер взломается. Изящный... ну не совсем.

input = [(print 'Name: '), gets.rstrip][1]

Ответ 4

Следующее @Bryn:

def prompt(default, *args)
  print(*args)
  result = gets.strip
  return result.empty? ? default : result
end

Ответ 5

Я знаю, что этот вопрос старый, но я бы показал, что я использую в качестве своего стандартного метода для ввода.

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? "

Ответ 6

Проблема с вашим предлагаемым решением заключается в том, что строка, которая должна быть напечатана, не может быть построена до тех пор, пока ввод не будет прочитан, не удален и не назначен. Вы можете разделить каждую строку точкой с запятой:

$ ruby -e 'print "Input text: "; input=gets.strip; puts input'
Input text: foo
foo

Ответ 7

Я нашел случайно Inquirer жемчужину, и мне это очень нравится, я нахожу его более аккуратным и простым в использовании, чем Highline, хотя он не имеет достаточной проверки входных данных. Ваш пример можно записать следующим образом

require 'inquirer'
inputs = Ask.input 'Input text'