未定义的方法`<'为零:NilClass

时间:2016-11-19 06:37:59

标签: ruby

创建冒泡排序程序时遇到了这个错误:

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])

3 个答案:

答案 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 数组中没有索引34,因为索引从arr开始计数,并且只有3个元素我的例子(这使得最后一个元素的索引0)。

修复:

2

答案 1 :(得分:2)

  

有谁知道这是什么意思?

这意味着arr[cntr]在此表达式中为零

if arr[cntr] < arr[cntr + 1]

哦,如果这个是零,那么arr[cntr + 1] 绝对为零。

提示:您正在访问超出数组范围的元素。

答案 2 :(得分:0)

在您的代码length中,变量值为6length = arr.length)。 当您将其迭代到0时......在第一次迭代中,cntr变量值将为6。 所以arr[cntr]获得nil值,因为您正在访问超出数组边界的元素。这就是您收到undefined method < for nil:NilClass (NoMethodError)错误的原因。