2012-02-22 58 views
2
cool_words = [] 

while true 

    cool_words.push gets 
    break if gets.chomp == '' 

end 

puts cool_words 

它僅推動第一條目,然後在第三和然後第五。我認爲這是我擺脫循環的方式,因爲沒有break方法它不會發生。紅寶石推送方法是交替

我需要它到break走出循環,當我在空行輸入。

在此先感謝!

+2

沒人要的,但如果你決定在某些時候採用一些函數式編程學習過程:'cool_words = $ stdin.lines.take_while(&:present?)'。 (當然,'present?'在active_support中,並且必須被要求(或者實現,一行),但是你明白了;-)) – tokland 2012-02-22 08:54:17

+0

@tokland如果你不想ActiceSupport或者一個猴子補丁,'take_while {| line |不是line.chomp!.empty? }'仍然很容易閱讀。 – 2012-02-22 09:44:54

+0

@邁克爾:是的,我知道,但我試圖用我最好的廣告出售FP :-) – tokland 2012-02-22 12:05:43

回答

5

您正在呼叫gets兩次在循環中。它第一次被推入陣列。第二次是比較一個空字符串的循環中斷。但每次它都在尋求一條新線路。

您只想每個循環一次調用gets。所以你可以將它保存在一個變量中,然後在代碼中多次使用該變量。

cool_words = [] 

while true 
    line = gets 
    cool_words.push line 
    break if line.chomp == '' 
end 

puts cool_words 

UPDATE:@MicahelKohl在評論中指出,你可以更優雅地像這樣完成上述任務:

cool_words = [] 

until (line = gets).to_s.chomp.empty? 
    cool_words << line 
end 

puts cool_words 
+0

非常感謝! – 2012-02-22 08:47:07

+2

爲什麼在循環條件下使用'while true'(Ruby有一個通用的'loop do' for btw)和'break':'until(line = gets.chomp).empty? cool_words <<行末' – 2012-02-22 09:40:20

+0

@MichaelKohl,我更新了我的答案,以包含更優雅的構造。 – 2012-02-22 10:05:47