2013-03-18 24 views
1

我想從ruby中的標準輸入一次讀取一個字節,但是,如果沒有新的數據可用,我希望方法立即返回,以便each_byte等。對我來說不是一種選擇,就我所知,因爲它們阻止了程序的執行。從標準輸入獲取下一個字節或零 - Ruby

理想的方法將我允許做這樣的事情:

byte = STDIN.next_byte_or_nil 
if(byte) 
#Process 
else 
#Do something else 
end 

如何做到這一點?

回答

2

如果讀操作阻塞,則可以使用​​,該異常會引發Errno::WOULDBLOCK異常。因此STDIN.read_nonblock(1) rescue nil將讀取一個字節而不會阻止或返回nil

既然你只使用nil值,查看呼叫是否成功,你並不真正需要的rescue nil雖然:

begin 
    byte = STDIN.read_nonblock(1) 
    #Process 
rescue Errno::WOULDBLOCK 
    #Do something else 
end 
0

getc是你要尋找的方法:

byte = STDIN.getc 
if byte 
    # Process 
else 
    # Do something else 
end 
+0

不爲我工作。雖然#Process部分正確執行,但第二部分從不執行,因爲getc會等待用戶實際鍵入某些內容,這不是我想要的。 – 2013-03-18 12:30:12

0

你可以嘗試使用readbyte來實現自己的目標。

+0

與其他答案一樣的問題。它只是阻止程序執行,直到用戶鍵入內容。 – 2013-03-18 12:32:07

+0

已輸入但尚未讀取的數據的存在。 – 2013-03-18 12:38:42