A menudo me encuentro haciendo lo siguiente:
print "Input text: "
input = gets.strip
¿Hay alguna forma elegante de hacer esto en una línea? Algo como:
puts "Input text: #{input = gets.strip}"
El problema con esto es que espera la entrada antes de mostrar el mensaje. ¿Algunas ideas?
Respuestas:
Echa un vistazo a Highline :
require "highline/import" input = ask "Input text: "
fuente
Creo que ir con algo como lo que sugirió Marc-Andre será el camino a seguir, pero ¿por qué traer una tonelada de código cuando puede definir una función de dos líneas en la parte superior de cualquier script que vaya a usar? :
def prompt(*args) print(*args) gets end name = prompt "Input name: "
fuente
.chomp
método después de logets
contrario, la variable contendría un\n
carácter de nueva línea al final.Un truco seguro. Agraciado ... bueno, no exactamente.
input = [(print 'Name: '), gets.rstrip][1]
fuente
input = (print 'Name: '; gets.rstrip)
es más legible. Pero ambas soluciones tienen problemas con losnil
valores. En Ruby 2.3 se pueden manejar con eleganciainput = (print 'Name: '; gets&.rstrip)
.Sé que esta pregunta es antigua, pero pensé que mostraría lo que uso como mi método estándar para obtener información.
require 'readline' def input(prompt="", newline=false) prompt += "\n" if newline Readline.readline(prompt, true).squeeze(" ").strip end
Esto es realmente bueno porque si el usuario agrega espacios extraños al final o al principio, los eliminará y mantendrá un historial de lo que ingresaron en el pasado (cambie
true
afalse
para que no haga eso). Y, siARGV
no está vacío,gets
intentará leer desde un archivoARGV
, en lugar de obtener entrada. Además,Readline
es parte de la biblioteca estándar de Ruby, por lo que no tiene que instalar ninguna gema. Además, no puede mover el cursor cuando usagets
, pero puede hacerlo conReadline
.Y sé que el método no es una línea, pero es cuando lo llamas
name = input "What is your name? "
fuente
Readline::readline
] finaliza el intérprete ruby y no devuelve el estado del terminal después de que el usuario presiona '^ C' cuando espera ingresar la línea".highline/import
Siguiendo el ejemplo de @ Bryn:
def prompt(default, *args) print(*args) result = gets.strip return result.empty? ? default : result end
fuente
El problema con la solución propuesta es que la cadena que se va a imprimir no se puede construir hasta que la entrada se lea, elimine y asigne. Puede separar cada línea con un punto y coma:
$ ruby -e 'print "Input text: "; input=gets.strip; puts input' Input text: foo foo
fuente
Encontré la gema Inquirer por casualidad y realmente me gusta, la encuentro mucho más ordenada y fácil de usar que Highline, aunque carece de validación de entrada por sí misma.
Tu ejemplo se puede escribir así
require 'inquirer' inputs = Ask.input 'Input text'
fuente