프롬프트를 표시하고 입력을 받고 변수에 할당하기위한 Ruby의 라이너 하나?


79

종종 나는 다음을 수행합니다.

print "Input text: "
input = gets.strip

한 줄로이 작업을 수행하는 우아한 방법이 있습니까? 다음과 같은 것 :

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

이것의 문제점은 프롬프트를 표시하기 전에 입력을 기다린다는 것입니다. 어떤 아이디어?


프롬프트 텍스트를 받아 입력 텍스트를 반환하는 함수로 만드시겠습니까? 더 좋아지고 여러 프롬프트 / 입력주기가 필요한 경우 함수가 일련의 프롬프트와 블록을 취한 다음 프롬프트를 반복하고 각 입력을 산출하도록 할 수 있습니다.
asm

답변:



76

나는 Marc-Andre가 제안한 것과 같은 것을 사용하는 것이 갈 길이라고 생각하지만, 사용할 스크립트의 맨 위에 두 줄 함수를 정의 할 수 있는데 왜 전체 코드를 가져와야합니까? :

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

name = prompt "Input name: "

2
실제로 그것도 잘 작동합니다. 입력 확인을 추가 할 때까지. 또는 일부 기본값. 또는 암호를 요구하기 때문에 입력 무엇을 보여주지 ...
마크 - 앙드레 Lafortune

4
5 초 스크립트의 경우 이것이 갈 길이라고 말하고 싶습니다.
Will Richardson

1
나는 첨부 할 .chomp후에 방법을 gets, 그렇지 않으면 변수가 포함됩니다 \n끝에 개행 문자를.
Toma Nistor 2018 년

32

확실히 하나의 라이너 해킹. 우아함 ... 정확히 아닙니다.

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

2
input = (print 'Name: '; gets.rstrip)더 읽기 쉽다고 생각 합니다. 그러나 두 솔루션 모두 nil가치에 문제가 있습니다. Ruby 2.3에서는 input = (print 'Name: '; gets&.rstrip).
michau

14

나는이 질문이 오래되었다는 것을 알고 있지만 입력을 얻는 표준 방법으로 사용하는 것을 보여줄 것입니다.

require 'readline'

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

사용자가 끝이나 처음에 이상한 공간을 추가하는 경우, 그것은 사람들을 제거하는 것이기 때문에 이것은 정말 좋은이며, 그들이 과거에 입력 한의 역사를 유지 (변경을 truefalse그것은 그렇게하지에.). 그리고이 ARGV비어 있지 않으면 입력을받는 대신 gets에서 파일을 읽으려고합니다 ARGV. 또한 ReadlineRuby 표준 라이브러리의 일부이므로 gem을 설치할 필요가 없습니다. 또한를 사용할 때는 커서를 이동할 수 gets없지만 Readline.

그리고 방법이 한 줄이 아니라는 것을 알고 있습니다.

name = input "What is your name? "

"참고 : [Readline::readline ]는 루비 인터프리터를 종료하고 사용자가 줄을 입력하는 동안 '^ C'를 눌렀을 때 터미널 상태를 반환하지 않습니다."
ma11hew28 2014

나는 이것을 사용하는 최선의 대안으로 highline/import
@Andrew

12

@Bryn의 리드를 따르십시오.

def prompt(default, *args)
  print(*args)
  result = gets.strip
  return result.empty? ? default : result
end

4

제안 된 솔루션의 문제점은 입력을 읽고, 제거하고, 할당 할 때까지 인쇄 할 문자열을 작성할 수 없다는 것입니다. 세미콜론으로 각 줄을 구분할 수 있습니다.

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

5
그것은 실제로 한 줄이 아닙니다. 세미콜론을 사용하고 있으며 아마도 그의 요청의 우아한 부분에 맞지 않을 것입니다.
대안으로

1
$ ruby ​​-e 'print ( "입력 텍스트 :") || (input = gets.strip) && (puts input)'
Lars Haugseth

1

나는 우연히 Inquirer gem을 찾았고 정말 마음에 들었습니다. 자체 입력 유효성 검사가 부족하지만 Highline보다 더 깔끔하고 사용하기 쉽습니다.
당신의 예는 다음과 같이 작성할 수 있습니다.

require 'inquirer'
inputs = Ask.input 'Input text'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.