web-dev-qa-db-fra.com

Un liner dans Ruby pour afficher une invite, obtenir une entrée et attribuer à une variable?

Souvent, je me retrouve à faire ce qui suit:

print "Input text: "
input = gets.strip

Existe-t-il un moyen gracieux de le faire en une seule ligne? Quelque chose comme:

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

Le problème est qu'il attend l'entrée avant d'afficher l'invite. Des idées?

75
Jarsen

Découvrez highline :

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

Je pense que partir avec quelque chose comme ce que Marc-Andre a suggéré sera le chemin à parcourir, mais pourquoi apporter une tonne de code lorsque vous pouvez simplement définir une fonction à deux lignes en haut du script que vous allez utiliser :

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

name = Prompt "Input name: "
72
Bryn

Un liner hack sûr. Gracieux ... enfin pas exactement.

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

Suivant l'exemple de Bryn:

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

Je sais que cette question est ancienne, mais je pensais que je montrerais ce que j'utilise comme méthode standard pour obtenir des entrées.

require 'readline'

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

C'est vraiment bien parce que si l'utilisateur ajoute des espaces étranges à la fin ou au début, il les supprimera et gardera un historique de ce qu'ils ont entré dans le passé (changez le true en false pour ne pas le faire.). Et, si ARGV n'est pas vide, alors gets essaiera de lire à partir d'un fichier dans ARGV, au lieu d'obtenir une entrée. De plus, Readline fait partie de la bibliothèque standard Ruby afin que vous n'ayez pas à installer de gemmes. De plus, vous ne pouvez pas déplacer votre curseur lorsque vous utilisez gets, mais vous pouvez avec Readline.

Et, je sais que la méthode n'est pas une ligne, mais c'est quand vous l'appelez

name = input "What is your name? "
10
Addison

Le problème avec votre solution proposée est que la chaîne à imprimer ne peut pas être créée tant que l'entrée n'est pas lue, supprimée et affectée. Vous pouvez séparer chaque ligne par un point-virgule:

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

J'ai trouvé le Inquirer bijou par hasard et je l'aime vraiment, je le trouve beaucoup plus soigné et facile à utiliser que Highline, bien qu'il manque de validation d'entrée par lui-même.
Votre exemple peut être écrit comme ceci

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