我常常覺得自己做以下幾點:Ruby中的一個內襯,用於顯示提示,獲取輸入和分配給變量?
print "Input text: "
input = gets.strip
有一種優雅的方式在一行做到這一點?例如:
puts "Input text: #{input = gets.strip}"
問題在於它在顯示提示符之前等待輸入。有任何想法嗎?
我常常覺得自己做以下幾點:Ruby中的一個內襯,用於顯示提示,獲取輸入和分配給變量?
print "Input text: "
input = gets.strip
有一種優雅的方式在一行做到這一點?例如:
puts "Input text: #{input = gets.strip}"
問題在於它在顯示提示符之前等待輸入。有任何想法嗎?
退房highline:
require "highline/import"
input = ask "Input text: "
與你提出的解決方案的問題是,要打印的字符串不能建,直到輸入被讀取,剝離和轉讓。你可以每行用分號分隔:
$ ruby -e 'print "Input text: "; input=gets.strip; puts input'
Input text: foo
foo
這不是真的單線;你正在使用分號,這可能不適合他的請求的優雅部分。 – alternative 2010-05-22 21:03:49
$ ruby -e'print(「Input text:」)||(input = gets.strip)&&(puts input)' – 2010-05-23 08:58:39
我想的東西像什麼馬克 - 安德烈·建議將是要走的路走,但爲什麼在整個噸的代碼帶來時,你可以定義在你要使用的任何腳本的頂部有一個雙線函數:
def prompt(*args)
print(*args)
gets
end
name = prompt "Input name: "
確實,這也可以正常工作。直到你想添加一些輸入檢查。或者一些默認值。或者不顯示輸入內容,因爲您要求輸入密碼... – 2010-05-23 03:05:15
對於一個5秒的腳本,我會說這是要走的路。 – javanut13 2013-03-28 10:56:14
一個班輪黑客肯定。優雅......不完全。
input = [(print 'Name: '), gets.rstrip][1]
這只是醜陋的工作! – 2012-12-01 02:13:46
我認爲'input =(print'Name:'; gets.rstrip)'更具可讀性。但是這兩種解決方案都存在「無」值的問題。在Ruby 2.3中,它們可以通過'input =(print'Name:'; gets&.rstrip)''正常處理。 – michau 2016-09-05 17:01:05
繼@布林的領先地位:
def prompt(default, *args)
print(*args)
result = gets.strip
return result.empty? ? default : result
end
我知道這個問題是舊的,但我以爲我會展示我爲我的用於獲取輸入標準方法使用。
require 'readline'
def input(prompt="", newline=false)
prompt += "\n" if newline
Readline.readline(prompt, true).squeeze(" ").strip
end
這是非常好的,因爲如果用戶在年底或年初增加了怪異的空間,它會刪除這些,它不斷的他們在過去進入了一個歷史(更改true
到false
沒有它那樣做。)。並且,如果ARGV
不爲空,那麼gets
將嘗試從ARGV
中的文件讀取,而不是獲取輸入。另外,Readline
是Ruby標準庫的一部分,因此您不必安裝任何寶石。另外,使用gets
時,不能移動光標,但可以使用Readline
。
而且,我知道這個方法是不是一條線,但它是當你把它
name = input "What is your name? "
「注意:[[''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
我喜歡這個和@Andrew Grimm的建議,作爲使用'highline/import'的最佳選擇 – 2014-05-12 17:16:38
我發現Inquirer寶石的機會,我真的很喜歡它,我覺得這樣更整潔比Highline更容易使用,儘管它缺乏自己的輸入驗證。
您的例子可以這樣寫
require 'inquirer'
inputs = Ask.input 'Input text'
使其成爲需要提示文本,並返回輸入文本的功能?如果你想變得更加奇特並且需要多個提示/輸入循環,你可以讓這個函數獲得一系列提示,一個Block然後遍歷提示併產生每個輸入。 – asm 2010-05-22 22:13:44