cool_words = []
while true
cool_words.push gets
break if gets.chomp == ''
end
puts cool_words
它仅推动第一条目,然后在第三和然后第五。我认为这是我摆脱循环的方式,因为没有break
方法它不会发生。红宝石推送方法是交替
我需要它到break
走出循环,当我在空行输入。
在此先感谢!
cool_words = []
while true
cool_words.push gets
break if gets.chomp == ''
end
puts cool_words
它仅推动第一条目,然后在第三和然后第五。我认为这是我摆脱循环的方式,因为没有break
方法它不会发生。红宝石推送方法是交替
我需要它到break
走出循环,当我在空行输入。
在此先感谢!
您正在呼叫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
非常感谢! – 2012-02-22 08:47:07
为什么在循环条件下使用'while true'(Ruby有一个通用的'loop do' for btw)和'break':'until(line = gets.chomp).empty? cool_words <<行末' – 2012-02-22 09:40:20
@MichaelKohl,我更新了我的答案,以包含更优雅的构造。 – 2012-02-22 10:05:47
没人要的,但如果你决定在某些时候采用一些函数式编程学习过程:'cool_words = $ stdin.lines.take_while(&:present?)'。 (当然,'present?'在active_support中,并且必须被要求(或者实现,一行),但是你明白了;-)) – tokland 2012-02-22 08:54:17
@tokland如果你不想ActiceSupport或者一个猴子补丁,'take_while {| line |不是line.chomp!.empty? }'仍然很容易阅读。 – 2012-02-22 09:44:54
@迈克尔:是的,我知道,但我试图用我最好的广告出售FP :-) – tokland 2012-02-22 12:05:43