2013-04-17 69 views
0

我試圖從命令行立即讀取一個字符而不使用回車。我使用的紅寶石(Ruby的1.9.3p374)代碼如下:STDIN.getch作爲一個非阻塞事件(這是可能的嗎?)

require 'io/console' 

ch = STDIN.getch 
puts ch 

直到現在everithing工作正常,但現在我希望把這段代碼無限循環裏面做一些其他的東西,像

loop do 
    puts "..doing stuff.." 
    ch = STDIN.getch 
    if ch == 'q' 
    break 
    end 
end 

但是這段代碼總是強制我們在每次打印之間按下一個鍵。我想要一個類似於STDIN.read_nonblock方法的行爲,但不必在按下一個字符後按Enter鍵。

基本上我想打印「..做東西..」,直到我按鍵盤上的某個鍵,但我不想使用輸入。

任何幫助將不勝感激。謝謝

回答

0

您可以隨時使用內置的curses庫來處理您的交互。它非常強大,用於構建鍵盤驅動的工具,如文本編輯器。

另一種方法是使用select來查詢STDIN是否可讀。您的終端可能處於線路緩衝狀態,因此您需要在接收到單個按鍵之前對其進行調整。這是Curses可以爲你處理的事情。

+0

謝謝你tadman。我將嘗試探索curses庫以檢查是否可以找到解決我的問題的方法。 –

+0

值得注意的是,輸入問題可能是由於終端線路緩衝。默認情況下,直到收到換行符纔會「發送」任何內容。雖然這可以改變,但是用低級調用做這件事很煩人。您還必須將終端恢復到默認狀態,否則您將破壞依賴線路緩衝的其他程序。詛咒雖然起初有點令人頭疼,但可以爲你做很多事情,並且能夠做好很多與終端管理有關的事情。 – tadman