Często robię następujące rzeczy:
print "Input text: "
input = gets.strip
Czy jest na to wdzięczny sposób w jednej linii? Coś jak:
puts "Input text: #{input = gets.strip}"
Problem polega na tym, że czeka na dane wejściowe przed wyświetleniem zachęty. Jakieś pomysły?
Odpowiedzi:
Sprawdź highline :
require "highline/import" input = ask "Input text: "
źródło
Wydaje mi się, że najlepszym rozwiązaniem będzie coś takiego, jak zasugerował Marc-Andre, ale po co wprowadzać całą masę kodu, skoro można po prostu zdefiniować funkcję dwuwierszową na początku dowolnego skryptu, którego zamierzasz użyć :
def prompt(*args) print(*args) gets end name = prompt "Input name: "
źródło
.chomp
metodę po, wgets
przeciwnym razie zmienna zawierałaby\n
na końcu znak nowej linii.Jedna linijka pewnie. Pełen wdzięku ... no nie do końca.
input = [(print 'Name: '), gets.rstrip][1]
źródło
input = (print 'Name: '; gets.rstrip)
jest bardziej czytelny. Ale oba rozwiązania mają problemy znil
wartościami. W Rubim 2.3 można je z wdziękiem obsługiwaćinput = (print 'Name: '; gets&.rstrip)
.Wiem, że to pytanie jest stare, ale pomyślałem, że pokażę, czego używam jako standardowej metody uzyskiwania danych wejściowych.
require 'readline' def input(prompt="", newline=false) prompt += "\n" if newline Readline.readline(prompt, true).squeeze(" ").strip end
To naprawdę fajne, ponieważ jeśli użytkownik doda dziwne spacje na końcu lub na początku, usunie je i zachowa historię tego, co wprowadził w przeszłości (zmień na,
true
abyfalse
tego nie robić). JeśliARGV
nie jest pusty,gets
spróbuje odczytać plik w formacieARGV
zamiast pobierać dane wejściowe. DodatkowoReadline
jest częścią standardowej biblioteki Ruby, więc nie musisz instalować żadnych klejnotów. Nie możesz również przesuwać kursora podczas używaniagets
, ale możesz to zrobić za pomocąReadline
.Wiem, że metoda nie jest jedną linijką, ale jest tak, jak ją wywołujesz
name = input "What is your name? "
źródło
Readline::readline
] kończy działanie interpretera ruby i nie zwraca statusu terminala po naciśnięciu przez użytkownika '^ C' podczas oczekiwania na wprowadzenie wiersza."highline/import
Podążając śladem @ Bryn:
def prompt(default, *args) print(*args) result = gets.strip return result.empty? ? default : result end
źródło
Problem z proponowanym rozwiązaniem polega na tym, że napisu do wydrukowania nie można zbudować, dopóki dane wejściowe nie zostaną odczytane, usunięte i przypisane. Możesz oddzielić każdą linię średnikiem:
$ ruby -e 'print "Input text: "; input=gets.strip; puts input' Input text: foo foo
źródło
Znalazłem klejnot Inquirer przez przypadek i bardzo mi się podoba, uważam, że jest o wiele bardziej schludny i łatwiejszy w użyciu niż Highline, chociaż brakuje mu własnej weryfikacji danych wejściowych.
Twój przykład można zapisać w ten sposób
require 'inquirer' inputs = Ask.input 'Input text'
źródło