2015-04-22 66 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行,但它会演示每个步骤你的问题出现了。 –