2014-09-21 35 views
0

我看到了兩種方式來使用gets,一個簡單的形式:差獲得方法

print 'Insert your name: ' 
name = gets() 
puts "Your name is #{name}" 

,並且把我的注意力的一種形式:

print 'Insert your name: ' 
STDOUT.flush 
name = gets.chomp 
puts "Your name is #{name}" 

第二樣品看起來如Perl使用默認輸出流的flush方法。 Perl使顯式的默認輸出流操作;方法flush對我來說是個謎。它的行爲可能與我推斷的不同,它使用chomp刪除新的行字符。

第二種形式在幕後發生了什麼?什麼情況下使用第二種形式是有用的或必要的?

+0

您有時會看到'gets.to_i'或'gets.to_f'。這裏不需要'chomp',因爲更一般地說,''123cat'.to_i => 123','「1.23dog」.to_f => 1.23'。 – 2014-09-21 18:31:57

回答

2

「沖洗」輸出確保它在等待輸入之前顯示打印的消息;這可能只是某人不必要地確定,或者可能是某些操作系統上需要它。或者,您可以使用STDOUT.sync = trueforce a flush after every output。 (您可能會疑惑,「爲什麼我不會總是使用它?」嗯,如果您的代碼輸出了大量內容,反覆刷新它可能會降低速度。)

chompchomp從結尾刪除換行符輸入。如果你想換行符(用戶輸入姓名後按「Enter」結果),那麼不要chomp它。

2

看一些Github code我可以看到,STDOUT.flush主要用於服務器端/多線程作業,而不是日常使用。

一般來說,當你想接受來自用戶的輸入時,你想要使用gets.chomp。請記住,無論用戶輸入什麼,Ruby都會將其解釋爲一個字符串。

要將其轉換爲整數,您需要爲浮點數調用to_ito_f。在這些情況下,您不需要chomp,因爲to_ito_f會自動刪除「\ n」。如你所見,有許多微妙的事情正在悄然發展,找出它們只是一個實踐問題。

+0

'to_i'和'to_f'不會*刪除尾部行結尾,他們忽略它,因爲它們只關心數字,或數字和小數。 – 2014-12-24 00:26:32

1

我很少看到有人使用STDOUT.flush,除了多線程。它也讓事情變得混亂,破壞了編寫優雅代碼的全部目的。