在创建气泡排序程序时,我遇到了以下错误:
test.rb:8:in `block in bubble_sort': undefined method `<' for nil:NilClass (NoMethodError)
from test.rb:6:in `downto'
from test.rb:6:in `bubble_sort'
from test.rb:16:in `<main>有人知道这是什么意思吗?以下是代码:
def bubble_sort(arr)
length = arr.length
sorted = false
length.downto(0) do |cntr|
if arr[cntr] < arr[cntr + 1]
end
end
end
bubble_sort([2,6,8,1,0,2])发布于 2016-11-19 07:10:26
错误消息undefined method '<' for nil:NilClass意味着您试图在<上调用nil。
在您的示例中,这必须是if arr[cntr] < arr[cntr + 1]比较。在接下来的步骤中,我们需要了解为什么arr[cntr]是nil。一个原因可能是arr数组中的cntr索引中没有元素,另一个原因可能是索引cntr超出了数组的范围。在您的示例中,这是导致问题的第二个原因。
为什么指数超出了界限?让我们仔细看看循环是如何构建的,并使用示例数组[a, b, c]这样做:
length = arr.length # length = 3 # [a, b, c].length
length.downto(0) do |cntr| # 3.downto(0) do |cntr|
if arr[cntr] < arr[cntr + 1] # if arr[3] < arr[4] # in the first iteration操作,在3数组中没有索引arr和4,因为索引开始使用0计数,在我的示例中只有3个元素(这使得最后一个元素的索引2)。
解决办法:
def bubble_sort(array)
(array.length - 2).downto(0).each do |index|
if array[index] < array[index + 1]
# ...
end
end
end发布于 2016-11-19 06:42:07
有人知道这是什么意思吗?
这意味着arr[cntr]在这个表达式中为零。
if arr[cntr] < arr[cntr + 1]哦,如果这个是零,那么arr[cntr + 1]肯定是,是零。
提示:您访问的元素超出了数组的范围。
发布于 2016-11-19 06:55:45
在您的代码中,length变量值将是6(length = arr.length)。当你把它迭代到0 ..。在第一次迭代中,cntr变量值将是6。因此,arr[cntr]获取nil值,因为您访问的元素超出了数组的范围。这就是为什么您要获得undefined method < for nil:NilClass (NoMethodError)错误。
https://stackoverflow.com/questions/40689956
复制相似问题