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


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

print "Input text: "
input = gets.strip

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

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

проблема с этим заключается в том, что он ждет ввода перед отображением приглашения. Есть идеи?

7 69

7 ответов:

проверить highline:

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

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

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 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'