NoMethodError未定义方法为空?对于NilClass

时间:2018-06-19 21:35:36

标签: ruby mergesort nomethoderror

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

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类之前停止执行。

为什么会出现此错误?

1 个答案:

答案 0 :(得分:1)

如果array.length < 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

这意味着firstsecond在大多数时间都是nil,并且有您的NoMethodError。也许您想在sorted_array之后返回until

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