Один вкладыш в Ruby для отображения подсказки, получения ввода и назначения переменной? - PullRequest
74 голосов
/ 23 мая 2010

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

print "Input text: "
input = gets.strip

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

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

Проблема в том, что он ожидает ввода, прежде чем отобразить подсказку. Есть идеи?

Ответы [ 7 ]

75 голосов
/ 23 мая 2010

Выезд Highline :

require "highline/import"
input = ask "Input text: "
72 голосов
/ 23 мая 2010

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

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

name = prompt "Input name: "
32 голосов
/ 16 февраля 2011

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

input = [(print 'Name: '), gets.rstrip][1]
12 голосов
/ 08 июня 2011

Вслед за лидерством @ Брин:

def prompt(default, *args)
  print(*args)
  result = gets.strip
  return result.empty? ? default : result
end
10 голосов
/ 19 марта 2014

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

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? "
4 голосов
/ 23 мая 2010

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

$ ruby -e 'print "Input text: "; input=gets.strip; puts input'
Input text: foo
foo
1 голос
/ 13 июня 2016

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

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