2015-04-22 68 views
0

我不斷收到以下錯誤。經過一些研究後,我認爲這是因爲我的數組訪問錯誤(錯誤地)是由於有一個NIL值。初學者數組迭代和錯誤代碼解釋

my_solution.rb:24:in `count_between': undefined method `>=' for nil:NilClass  
(NoMethodError) from my_solution.rb:35:in `<main>' 

我是新來讀的錯誤代碼,所以也許這就是我出錯的地方。但是,由於錯誤提示,它在線上獲得了隧道視覺。然而我無法修復它,所以無奈之下,我隨即將(< =)行隨機更改爲(<)。這固定了它。

  1. 這是爲什麼解決它?我唯一的猜測是最初使用(< =)使它迭代「太遠」,從而以某種方式返回NIL?

  2. 錯誤代碼爲什麼說它是第24行的元素導致問題,當它實際上是第23行的元素?我是新手,並且試圖通過錯誤代碼暗示,所以這是一個奇怪的經歷。

感謝您的任何指導。

# count_between is a method with three arguments: 
# 1. An array of integers 
# 2. An integer lower bound 
# 3. An integer upper bound 
# 
# It returns the number of integers in the array between the lower and upper   
# bounds, 
# including (potentially) those bounds. 
# 
# If +array+ is empty the method should return 0 
# Your Solution Below: 

def count_between(list_of_integers, lower_bound, upper_bound) 
if list_of_integers.empty? 
    return 0 
else 
    count = 0 
    index = 0 

    ##line 23## 
    while index <= list_of_integers.length 

    ##line24## 
     if list_of_integers[index] >= lower_bound &&  
     list_of_integers[index] <= upper_bound 

      count += 1 
      index += 1 
     else 
      index += 1 
     end 
    end 
return count 
end 
end 

puts count_between([1,2,3], 0, 100) 
+0

[1,2,3] .length => 3但是數組索引從0開始,所以要遍歷一個數組,您可以這樣做,而我 nikkypx

回答

1

<= list_of_integers.length最後索引是該陣列的外面,由於陣列的第一索引是0,最後是array.length - 1

你的錯誤說24行的原因是第23行工作正常---它只是計算出index的值小於或等於數組長度。但是,嘗試在數組中的該索引處引用該元素後,該元素將指定爲零 - 並且您無法在nil上執行>=操作。

這裏可能有幫助的一件事是啓動一個irb。如果你試圖引用一個超出界限的元素,你只會得到零。如果您嘗試對同一參考文件執行某項操作(該文件未在nil.methods中列出),則會引發您所看到的錯誤。

+0

感謝您拼寫出來,非常合理。獲得的經驗:要注意遍歷數組,注意在特定行中發現錯誤時,錯誤的「源」可能來自其他地方。關於IRB,我其實也很新。我很樂意嘗試你所提到的。我發現的問題是,在IRB中逐行輸入代碼感覺很乏味,然後如果我犯了一個錯誤,我想我必須重新輸入一遍?而在Sublime Text中,我只需編輯該行並重新運行該程序。雖然我可能接近錯誤。感謝您的任何提示。 – TCannadySF

+0

不,你是對的,如果你想插入很多行,可能會很乏味,但它可以有助於快速,有針對性地反饋你的問題的微型版本。例如,如果您創建了一個數組並將其存儲在一個變量中,則嘗試引用一個超出範圍的索引,然後嘗試對該同一個引用執行操作 - 這將是3行,但它會演示每個步驟你的問題出現了。 –