2016-11-24 19 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)通過跳出循環來處理異常,這是終止' loop'。出於這個原因,我比較喜歡這個,但它很小。爲了更好的可讀性,可以寫兩行:'如果我==退出,則引發StopIteration;一個<< 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

相關問題