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
.chompmétodo después de logetscontrario, la variable contendría un\ncará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 losnilvalores. 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 endEsto 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
trueafalsepara que no haga eso). Y, siARGVno está vacío,getsintentará leer desde un archivoARGV, en lugar de obtener entrada. Además,Readlinees 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/importSiguiendo el ejemplo de @ Bryn:
def prompt(default, *args) print(*args) result = gets.strip return result.empty? ? default : result endfuente
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 foofuente
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