【问题标题】:NoMethodError undefined method empty? for NilClassNoMethodError 未定义的方法为空?对于 NilClass
【发布时间】:2018-06-19 21:35:36
【问题描述】:

我正在尝试实现合并排序算法。我有以下代码:

def merge_sort(array)
  if array.length < 2
    return array
  else
    length = array.length
    i = array[0..array.length/2-1]
    j = array[array.length/2 .. -1]
    first = merge_sort(i)
    second = merge_sort(j)

    sorted_array = []
    until first.empty? || second.empty? do
      if first[0] >= second[0]
        sorted_array << second.shift
      else
        sorted_array << first.shift
      end
    end
  end
end

我收到了NoMethodError for NilClass。 据我了解,unless 块应该检查空数组,并在 Nil 类发生之前停止执行。

为什么会出现这个错误?

【问题讨论】:

  • 这不会回答你的问题,但你可以试试看here
  • 你没有unless 块。

标签: ruby mergesort nomethoderror


【解决方案1】:

如果array.length &lt; 2,那么您的merge_sort 将返回array。否则,merge_sort 将返回任何 until some_condition do ... end 的计算结果。碰巧until 评估为nil,所以您的方法的行为如下:

def merge_sort(array)
  if array.length < 2
    return array
  else
    # Do a bunch of stuff...
    return nil
  end
end

这意味着first 和second 大部分时间都是nil,而你的NoMethodError。也许你想在until 之后返回sorted_array:

def merge_sort(array)
  if array.length < 2
    array
  else
    #...
    sorted_array = []
    until first.empty? || second.empty? do
      #...
    end
    sorted_array # <------------------- sort of important
  end
end

【讨论】:

  • 我认为您的回答解决了最初提出的问题。原始代码中还有另一个不相关的错误。一旦first 为空或second 为空,until 循环就会结束,并且不会添加非“空”循环中的剩余元素。所以要修复没有被问到的bug,我们需要在返回之前将first和second的剩余元素添加到sorted_array。
  • @MikeK 我不想为他们编写代码或带走宝贵的调试经验。这对我来说看起来像是学生的工作,所以我不想放弃太多,他们需要学习如何构建一组适当的测试以及如何在测试失败时进行调试。我当然可能是错的。
猜你喜欢
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
相关资源
最近更新 更多