2012-02-22 47 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