2010-05-22 15 views
66

我常常覺得自己做以下幾點:Ruby中的一個內襯,用於顯示提示,獲取輸入和分配給變量?

print "Input text: " 
input = gets.strip 

有一種優雅的方式在一行做到這一點?例如:

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

問題在於它在顯示提示符之前等待輸入。有任何想法嗎?

+0

使其成爲需要提示文本,並返回輸入文本的功能?如果你想變得更加奇特並且需要多個提示/輸入循環,你可以讓這個函數獲得一系列提示,一個Block然後遍歷提示併產生每個輸入。 – asm 2010-05-22 22:13:44

回答

67

退房highline

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

與你提出的解決方案的問題是,要打印的字符串不能建,直到輸入被讀取,剝離和轉讓。你可以每行用分號分隔:

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

這不是真的單線;你正在使用分號,這可能不適合他的請求的優雅部分。 – alternative 2010-05-22 21:03:49

+1

$ ruby​​ -e'print(「Input text:」)||(input = gets.strip)&&(puts input)' – 2010-05-23 08:58:39

64

我想的東西像什麼馬克 - 安德烈·建議將是要走的路走,但爲什麼在整個噸的代碼帶來時,你可以定義在你要使用的任何腳本的頂部有一個雙線函數:

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

name = prompt "Input name: " 
+2

確實,這也可以正常工作。直到你想添加一些輸入檢查。或者一些默認值。或者不顯示輸入內容,因爲您要求輸入密碼... – 2010-05-23 03:05:15

+4

對於一個5秒的腳本,我會說這是要走的路。 – javanut13 2013-03-28 10:56:14

28

一個班輪黑客肯定。優雅......不完全。

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

這只是醜陋的工作! – 2012-12-01 02:13:46

+1

我認爲'input =(print'Name:'; gets.rstrip)'更具可讀性。但是這兩種解決方案都存在「無」值的問題。在Ruby 2.3中,它們可以通過'input =(print'Name:'; gets&.rstrip)''正常處理。 – michau 2016-09-05 17:01:05

11

繼@布林的領先地位:

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

我知道這個問題是舊的,但我以爲我會展示我爲我的用於獲取輸入標準方法使用。

require 'readline' 

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

這是非常好的,因爲如果用戶在年底或年初增加了怪異的空間,它會刪除這些,它不斷的他們在過去進入了一個歷史(更改truefalse沒有它那樣做。)。並且,如果ARGV不爲空,那麼gets將嘗試從ARGV中的文件讀取,而不是獲取輸入。另外,Readline是Ruby標準庫的一部分,因此您不必安裝任何寶石。另外,使用gets時,不能移動光標,但可以使用Readline

而且,我知道這個方法是不是一條線,但它是當你把它

name = input "What is your name? " 
+0

「注意:[[''Readline :: readline'](http://www.ruby-doc.org/stdlib-2.1.1/libdoc/readline/rdoc/Readline.html#method-c-readline)]終止紅寶石解釋器並且在等待輸入線路時用戶按'^ C'後不返回終端狀態。「 – ma11hew28 2014-04-16 15:47:26

+0

我喜歡這個和@Andrew Grimm的建議,作爲使用'highline/import'的最佳選擇 – 2014-05-12 17:16:38

1

我發現Inquirer寶石的機會,我真的很喜歡它,我覺得這樣更整潔比Highline更容易使用,儘管它缺乏自己的輸入驗證。
您的例子可以這樣寫

require 'inquirer' 
inputs = Ask.input 'Input text' 
相關問題