首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于nil:nil类的未定义方法`<‘

用于nil:nil类的未定义方法`<‘
EN

Stack Overflow用户
提问于 2016-11-19 06:37:58
回答 3查看 1.1K关注 0票数 0

在创建气泡排序程序时,我遇到了以下错误:

代码语言:javascript
复制
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>

有人知道这是什么意思吗?以下是代码:

代码语言:javascript
复制
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])
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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]这样做:

代码语言:javascript
复制
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数组中没有索引arr4,因为索引开始使用0计数,在我的示例中只有3个元素(这使得最后一个元素的索引2)。

解决办法:

代码语言:javascript
复制
def bubble_sort(array)
  (array.length - 2).downto(0).each do |index|
    if array[index] < array[index + 1]
      # ...
    end
  end
end
票数 3
EN

Stack Overflow用户

发布于 2016-11-19 06:42:07

有人知道这是什么意思吗?

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

代码语言:javascript
复制
if arr[cntr] < arr[cntr + 1]

哦,如果这个是零,那么arr[cntr + 1]肯定是是零。

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

票数 2
EN

Stack Overflow用户

发布于 2016-11-19 06:55:45

在您的代码中,length变量值将是6(length = arr.length)。当你把它迭代到0 ..。在第一次迭代中,cntr变量值将是6。因此,arr[cntr]获取nil值,因为您访问的元素超出了数组的范围。这就是为什么您要获得undefined method < for nil:NilClass (NoMethodError)错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40689956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档