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?
Antworten:
Schauen Sie sich die Highline an :
require "highline/import" input = ask "Input text: "
quelle
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: "
quelle
.chomp
Methode anhängen , nachdemgets
sonst die Variable\n
am Ende ein Zeilenumbruchzeichen enthalten würde .Ein Liner hackt sicher. Anmutig ... na ja, nicht genau.
input = [(print 'Name: '), gets.rstrip][1]
quelle
input = (print 'Name: '; gets.rstrip)
ist besser lesbar. Beide Lösungen haben jedoch Probleme mitnil
Werten. In Ruby 2.3 können sie problemlos behandelt werdeninput = (print 'Name: '; gets&.rstrip)
.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
true
infalse
, damit es das nicht tut.). Und wennARGV
es nicht leer ist,gets
wird versucht, aus einer Datei einzulesenARGV
, anstatt Eingaben zu erhalten. AußerdemReadline
ist es Teil der Ruby-Standardbibliothek, sodass Sie keine Edelsteine installieren müssen. Außerdem können Sie den Cursor bei der Verwendung nicht bewegengets
, aber Sie können mitReadline
.Und ich weiß, dass die Methode nicht eine Zeile ist, sondern wenn Sie sie aufrufen
name = input "What is your name? "
quelle
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."highline/import
Nach @ Bryns Führung:
def prompt(default, *args) print(*args) result = gets.strip return result.empty? ? default : result end
quelle
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
quelle
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'
quelle