2016-11-24 7 views
1

このスクリプトは、ユーザがexitと入力するまで入力を継続します。その時点でループが途切れます。しかし、なぜループはnilを返し、オブジェクトはwith_objectに渡されませんか?`with_object`に渡されたオブジェクトを返すようにループを修正する方法はありますか?

puts "enter lines, type exit to finish" 

loop.with_object([]) do |_,a| 
    i = gets.chomp 
    i == 'exit' ? break : a << i 
end 
#=> nil 

official documentationEnumerator#with_objectによると、それに渡されたオブジェクトを返す必要があります。

+1

代わりに 'i == 'exit'と書くことができますか? (StopIterationを上げる):a << i'。 [Kernel#loop](http://ruby-doc.org/core-2.3.0/Kernel.html#method-i-loop)は、ループを中断することによって例外を処理します。これは、通常の 'ループ。その理由から、私はあなたが持っているものよりもこれを好むが、それは軽微だ。読みやすくするために、これを2行に書くとよいでしょう。 'raise StopIteration if i == exit; a << iである。 –

答えて

2

break aと書くと、戻り値はbreakで、デフォルトはnilです。

意味で
loop.with_object([]) do |_,a| 
    i = gets.chomp 
    i == 'exit' ? (break a) : a << i 
end 
#=> whatever #a is 

breakオーバーライドwith_objectの戻り値なので、手動で再びそれを設定する必要があります。

+1

同じことが 'inject' /' reduce'と 'next'にも当てはまります。 – mudasobwa

関連する問題