2012-09-11 55 views
0

我不知道爲什麼這個遞歸方法返回NoMethodError: undefined method '[]' for nil:NilClass遞歸方法返回未定義的方法「[]」

def test_method(a, b) 
    (a[0] == b[0] ? 0 : 1) + test_method(a[1..-1], b[1..-1]) 
end 

編輯:我在字符串發送的參數進行比較。

+1

你發送了什麼參數到這個方法來獲得這個異常? –

+0

我在發送字符串來比較它們。 – Fralcon

回答

1

事實上,在同一時間,它會降低空字符串,然後到零。然後導致NoMethodError:undefined方法'[]'爲nil:NilClass。

像這樣的事情正在發生:

'ss'[1..-1] => 's' 
'ss'[1..-1][1..-1] => "" 
'ss'[1..-1][1..-1][1..-1] => nil 
1

這是因爲您沒有檢查a和b是否爲空數組。曾經有一段時間,這將減少對空數組

打電話之前,你應該寫

if not (a.empty? or b.empty?) 
    (a[0] == b[0] ? 0 : 1) + test_method(a[1..-1], b[1..-1]) 
end 
+0

我計劃在稍後添加空字符串檢查。我需要檢查它的權利嗎?我一直在做的所有測試都使用長度超過5個字符的字符串,所以我認爲這不會有問題。 – Fralcon

+0

,但有時候會像[6 ..- 6]一樣回零。在控制檯中檢查這一點 –

+0

如果它是遞歸的,那麼在某些時候你必須達到目的。 – Azolo

1

既然你遍歷一個更小的陣列/串/不管,你必須考慮達到它的結束。我不知道你要完成什麼,但是這至少可以阻止它被炸燬:

def test_method(a, b) 
    return 0 if a.nil? || b.nil? 
    (a[0] == b[0] ? 0 : 1) + test_method(a[1..-1], b[1..-1]) 
end