2014-03-05 31 views
2

在檢查其他人的解決方案後,我的代碼在這裏看起來與正確答案非常相似。我認爲唯一的區別是我定義的方式ab。出於某種原因,它說他們都在NilClass中......?此代碼中的NilClass在哪裏? (歐拉項目#8)

def product(num) 
    i = 0 
    j = 4 
    arr = num.to_s.scan(/d/).map {|e| e.to_i} #can use .split('') vs .scan 
    a = (arr[i]..arr[j]).inject(:*) # vs (1) {|product, n| product * n} 

    while j <= arr.length 
    b = (arr[i+1]..arr[j+1]).inject(:*) 

    a = b if b > a 
    i+=1 
    j+=1 
    end 
    puts a 
end 

回答

3

正則表達式字面/d/匹配d litearlly。

如果你打算匹配數字,你應該使用\d來代替。

否則,沒有匹配; arr成爲一個空陣列。索引空數組總是產生nil

arr = [] 
arr[0] # => nil 
+0

這是有效的,但現在我在if語句中得到了'undefined method'>'for nil:NilClass'。 – funfuntime

+0

@KevinC,我不想寵壞。提示:'arr [i + 1] .. arr [j + 1]' – falsetru

+1

啊,算出來了。 'arr [i + 1] .. arr [j + 1]'接受索引的值,所以它循環,比如說'7..1'。相反,我需要'arr [i..j]'。 (另外,我必須將'i + = 1'和'j + = 1'移到while循環的頂部。) – funfuntime

0

你也有一個數組下標的問題。數組arr的最後一個索引是arr.length - 1。但是你的代碼:

while j <= arr.length b = (arr[i+1]..arr[j+1]).inject(:*)

試圖訪問數組高達指數arr.length + 1