Ein Liner in Ruby zum Anzeigen einer Eingabeaufforderung, zum Abrufen von Eingaben und zum Zuweisen zu einer Variablen?

79

Oft mache ich Folgendes:

print "Input text: "
input = gets.strip

Gibt es eine anmutige Möglichkeit, dies in einer Zeile zu tun? Etwas wie:

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

Das Problem dabei ist, dass es auf die Eingabe wartet, bevor die Eingabeaufforderung angezeigt wird. Irgendwelche Ideen?

Jarsen
quelle
Machen Sie es zu einer Funktion, die den Eingabeaufforderungstext verwendet und den eingegebenen Text zurückgibt? Wenn Sie schicker werden möchten und mehrere Eingabeaufforderungs- / Eingabezyklen benötigen, können Sie die Funktion veranlassen, ein Array von Eingabeaufforderungen und einen Block zu verwenden, dann die Eingabeaufforderungen zu durchlaufen und jede Eingabe zu erhalten.
Asm

Antworten:

77

Schauen Sie sich die Highline an :

require "highline/import"
input = ask "Input text: "
Marc-André Lafortune
quelle
76

Ich denke, mit so etwas wie dem, was Marc-Andre vorgeschlagen hat, wird der richtige Weg sein, aber warum eine ganze Tonne Code einbringen, wenn Sie einfach eine zweizeilige Funktion oben in dem Skript definieren können, das Sie verwenden möchten ::

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

name = prompt "Input name: "
Bryn
quelle
2
In der Tat wird das auch gut funktionieren. Bis Sie eine Eingabeprüfung hinzufügen möchten. Oder ein Standardwert. Oder zeigen Sie nicht, was eingegeben wurde, weil Sie nach einem Passwort fragen ...
Marc-André Lafortune
4
Für ein 5-Sekunden-Skript würde ich sagen, dass dies der richtige Weg ist.
Will Richardson
1
Ich würde die .chompMethode anhängen , nachdem getssonst die Variable \nam Ende ein Zeilenumbruchzeichen enthalten würde .
Toma Nistor
32

Ein Liner hackt sicher. Anmutig ... na ja, nicht genau.

input = [(print 'Name: '), gets.rstrip][1]
rbnewb
quelle
2
Ich denke input = (print 'Name: '; gets.rstrip)ist besser lesbar. Beide Lösungen haben jedoch Probleme mit nilWerten. In Ruby 2.3 können sie problemlos behandelt werden input = (print 'Name: '; gets&.rstrip).
Michau
14

Ich weiß, dass diese Frage alt ist, aber ich würde zeigen, was ich als Standardmethode für die Eingabe verwende.

require 'readline'

def input(prompt="", newline=false)
  prompt += "\n" if newline
  Readline.readline(prompt, true).squeeze(" ").strip
end

Das ist wirklich schön, denn wenn der Benutzer am Ende oder am Anfang seltsame Leerzeichen hinzufügt, werden diese entfernt, und es wird ein Verlauf dessen gespeichert, was sie in der Vergangenheit eingegeben haben (Ändern Sie das truein false, damit es das nicht tut.). Und wenn ARGVes nicht leer ist, getswird versucht, aus einer Datei einzulesen ARGV, anstatt Eingaben zu erhalten. Außerdem Readlineist es Teil der Ruby-Standardbibliothek, sodass Sie keine Edelsteine ​​installieren müssen. Außerdem können Sie den Cursor bei der Verwendung nicht bewegen gets, aber Sie können mit Readline.

Und ich weiß, dass die Methode nicht eine Zeile ist, sondern wenn Sie sie aufrufen

name = input "What is your name? "
Addison
quelle
"HINWEIS: [Readline::readline ] beendet den Ruby-Interpreter und gibt den Terminalstatus nicht zurück, nachdem der Benutzer beim Warten auf die Eingabezeile '^ C' gedrückt hat."
ma11hew28
Ich mag dies und @ Andrew Grimms Vorschlag als beste Alternative zur Verwendunghighline/import
Chux Uzoeto
12

Nach @ Bryns Führung:

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

Das Problem mit Ihrer vorgeschlagenen Lösung besteht darin, dass die zu druckende Zeichenfolge erst erstellt werden kann, wenn die Eingabe gelesen, entfernt und zugewiesen wurde. Sie können jede Zeile mit einem Semikolon trennen:

$ ruby -e 'print "Input text: "; input=gets.strip; puts input'
Input text: foo
foo
Maerics
quelle
5
Das ist nicht wirklich einzeilig; Sie verwenden Semikolons und das würde wahrscheinlich nicht zum anmutigen Teil seiner Anfrage passen.
Alternative
1
$ ruby ​​-e 'print ("Eingabetext:") || (input = gets.strip) && (gibt Eingabe ein)'
Lars Haugseth
1

Ich habe das Inquirer- Juwel zufällig gefunden und es gefällt mir sehr gut. Ich finde es viel ordentlicher und benutzerfreundlicher als Highline, obwohl es keine eigene Eingabevalidierung gibt.
Ihr Beispiel kann so geschrieben werden

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