NoMethodError undefined method empty? for NilClass



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

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

为什么我会收到此错误?

如果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。也许您想在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

相关内容