2013-03-31 18 views
1

http://rubymonk.com/learning/books/1/problems/148-array_of_fixnumruby​​monk「數組中的所有元素都是Fixnum」?

紅寶石僧表明:

def array_of_fixnums?(array) 
    array.all? { |x| x.is_a? Fixnum } 
end 

即精細和所有,但是下面的代碼工作在IRB 1.9.2但當rubymonk經過一個空數組失敗:

def array_of_fixnums?(array) 
    result = false 
    array.each { |n| 
    if n.is_a? Fixnum 
     result = true 
    else 
     result = false 
    end } 
    result 
end 

這裏是irb輸出:

1.9.2-p320 :001 > array_of_fixnums? [] 
=> false 

這裏是什麼rubymonk說,關於我的解決方案:

returns 'true' for [1,2,3] ✔ 
returns 'false' for ['a',1,:b] ✔ 
returns 'true' for [] 
    RSpec::Expectations::ExpectationNotMetError 
    expected false to be true 

我不知道爲什麼會這樣?

更新基於答案:

def array_of_fixnums?(array) 
    result = true 
    array.each { |n| return false unless n.is_a? Fixnum } 
    result 
end 

回答

1

您的代碼有兩個問題:

  1. 問題是在一個稍微模糊的方式表述。他們真正想要的是,如果任何元素不是Fixnums,則返回false,否則返回true - 所以一個空數組應該爲true。如果你看看你的代碼,你會發現result開始是false,所以如果數組是空的,即使測試認爲它應該是true,它也會返回false。你可以通過真實地開始解決這個問題。

  2. 您的代碼實際上只是檢測數組的最後元素是否爲Fixnum。我們來看看數組[1, "nope", 3]。它會首先看到1並將result設置爲true,然後它會看到「nope」並將result設置爲false,然後它會看到3並將result設置爲true,並且這就是該方法返回的結果。 RubyMonks測試實際上不會檢測到這個錯誤,但它會顯示在現實世界中。您想在得到錯誤結果後立即返回,因爲這足以確定數組是而不是所有Fixnums。

+0

謝謝。這更有意義。那麼,爲什麼我們要給空陣列帶來疑問的好處呢?它似乎處於量子狀態,它不是Fixnums的數組,也不是一組不是Fixnums的數組? – cheshirecatalyst

+0

@cheshirecatalyst確實,你可以在那裏合理地爭論真假。我真正能夠說的是,真正的是「所有」類型算法的傳統默認值,可能是因爲它是最明顯的實現。 (相反,'any?'默認爲false,大概是出於同樣的原因。) – Chuck

+0

再次感謝,這有助於澄清問題^ _ ^ – cheshirecatalyst

0

對於這種情況,因爲在array沒有元素,你將永遠不會進入每個週期。因此,您將上述行中設置爲false的result的默認值返回。但是,如果數組中沒有元素,則其所有元素都是Fixnums,因此您應該返回true。

+0

非常感謝,我根據查克和您的回覆更新了代碼 – cheshirecatalyst

相關問題