创建冒泡排序程序时遇到了这个错误:
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])
答案 0 :(得分:3)
错误消息f.text_field
表示您尝试在undefined method '<' for nil:NilClass
的某些内容上致电<
。
在您的示例中,必须是nil
比较。在下一步中,我们需要找出if arr[cntr] < arr[cntr + 1]
为arr[cntr]
的原因。一个原因可能是nil
索引中的arr
数组中没有元素,另一个原因可能是索引cntr
超出了数组的范围。在您的示例中,这是导致问题的第二个原因。
为什么索引超出范围?让我们仔细看看如何构建循环并使用示例数组cntr
来执行此操作:
[a, b, c]
Ops,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
和4
,因为索引从arr
开始计数,并且只有3个元素我的例子(这使得最后一个元素的索引0
)。
修复:
2
答案 1 :(得分:2)
有谁知道这是什么意思?
这意味着arr[cntr]
在此表达式中为零
if arr[cntr] < arr[cntr + 1]
哦,如果这个是零,那么arr[cntr + 1]
绝对为零。
提示:您正在访问超出数组范围的元素。
答案 2 :(得分:0)
在您的代码length
中,变量值为6
(length = arr.length
)。
当您将其迭代到0
时......在第一次迭代中,cntr
变量值将为6
。
所以arr[cntr]
获得nil
值,因为您正在访问超出数组边界的元素。这就是您收到undefined method < for nil:NilClass (NoMethodError)
错误的原因。