2015-02-10 70 views
0

我有一個多行輸入使用gets參數,很好。問題是,它跳過我的下一個變...Ruby跳過之前得到的參數

print "Multi-line response: " 
response = gets("done").chomp 

print "One line response: " 
oneLine = gets.chomp 

前兩行按預期運行(我可以輸入多行文本,直到我類型來完成的,然後按回車)。然後打印「一行響應:」並退出程序。我從來沒有得到oneline的輸入。

這是怎麼發生的?

+0

我只是登錄,查看您的評論在您的其他問題。我更新了我的答案,但@itdoesntwork完全正確。 – Anthony 2015-02-10 23:56:04

回答

2

Kernel#gets實際上可以採取參數,分隔符。這告訴Ruby何時停止從標準輸入讀取。如果您不提供此參數,則使用默認值\n$/)。這是你的程序運行的時候會發生什麼:

  • gets要求的一切,直到第一個done
  • 您輸入內容,然後輸入done,然後按回車。這是關鍵,因爲現在輸入流以done\n結尾,但gets只讀到done
  • gets要求的一切,直到第一\n\ndone後立即發現,並gets已經擁有它,因爲你已經輸入它,所以它不會問你了。

這就是爲什麼你沒有機會在第一個gets之後輸入任何東西。爲了消除這個問題,如果你想嚴格按照自己的方式,你應該製作分隔符"done\n",或者"\ndone\n"

+0

很棒的答案itdoesntwork – Anthony 2015-02-10 23:56:26

+0

感謝您的細節!沒辦法,我會想出來的! – Milksnake12 2015-02-11 00:00:46

0

當致電gets("done")時,Ruby讀取STDIN,直到找到任何發生的done。這不一定需要在一條線上,或者甚至在線的開始或結束處。一旦你輸入了包含done的行,Ruby將返回。

現在,Ruby將只讀輸入,直到它消耗了done。其餘的輸入不會被讀取,但會保存在緩衝區中。因此,對於你的情況,如果你在你的終端中輸入一個包含done的行並按下回車鍵,Ruby將只消耗完成,但不會消耗新行。

換行符(或通常在done之後的行的其餘部分)只會在下一個gets消耗。因此,您的第二個gets直接返回。

爲了解決這個問題,更好的方法,然後用分離器參數gets是使用一個循環:

response = "" 
while line = gets do 
    response << line 
    break if line == "done\n" 
end 
response.chomp!