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

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

print "Input text: "
input = gets.strip

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

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

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



답변

highline 확인 :

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


답변

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

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

name = prompt "Input name: "


답변

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

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


답변

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

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? "


답변

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

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


답변

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

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


답변

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

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