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

while true 

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

end 

puts cool_words 

最初のエントリを押してから3番目と5番目を押すだけです。 breakメソッドがなければ、それは起こらないので、私はそれがループから抜け出す方法だと思います。ルビープッシュメソッドが交互に表示されます

私は空の行に入力するとループの外にそれが必要ですbreak

ありがとうございます!

+2

誰も尋ねませんが、いくつかの時点でいくつかの関数型プログラミングを適用することにした場合学習プロセス: 'cool_words = $ stdin.lines.take_while(&:present?)'。 (与えられた 'present?'はactive_supportにあり、必須である(または1行実装されていなければならない)が、ポイントを得る;-)) – tokland

+0

@tokland ActiceSupportやmonkey-patchをそう簡単にしたくない、 'take_while {| line | line.chompでなく.empty? } 'はまだ読みやすいほど簡単です。 –

+0

@マイケル:ええ、知っているけど、最高の広告でFPを売ろうとしていた:-) – tokland

答えて

5

getsを2回ループしてを呼び出しています。最初に配列にプッシュされています。 2回目は、ループを壊すために空の文字列と比較しています。しかし、毎回新しい行を求めています。

ループごとにgetsを1回だけ呼び出すだけです。したがって、変数に変数を保存し、コード内でその変数を複数回使用することができます。

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

ありがとう! –

+2

なぜwhile whileを使用するのですか(ループはそのbtwのための汎用的な 'loop do'を持っています)、ループ条件を満たすとき' break'を使います: 'until(line = gets.chomp).empty? cool_words << line end' –

+0

@MichaelKohl、私はよりエレガントな構成を含めるように私の答えを更新しました。 –

関連する問題