与快速排序中的零错误进行比较
Comparing with nil error in quicksort
我试图在 Ruby 中编写快速排序,但我收到一条错误消息:
qsort.rb:43:in `<': comparison of Fixnum with nil failed (ArgumentError)
from qsort.rb:43:in `block in dist'
from qsort.rb:42:in `each'
from qsort.rb:42:in `dist'
from qsort.rb:32:in `sort'
from qsort.rb:34:in `sort'
from qsort.rb:53:in `<main>'
这是我的代码:
#!usr/bin/ruby
class QArray
@data = []
@pvalue
@less
@more
def initialize(arr = [])
@data = arr
@pvalue = @data[0] unless @data.empty?
end
#these methods are so I can treat a QArray like a regular array
def push(value)
@data.push value
end
def empty?
@data.empty?
end
def single?
return @data.size == 1
end
def print
puts @data
end
def sort
puts "starting the sort with an array of #{@data}"
dist unless @data.empty?
@less.sort unless @less.empty? || @less.single?
@more.sort unless @more.empty? || @more.single?
@data = @less + @more #combine the two arrays again
end
def dist
#distributes values into subarrays
@less = QArray.new
@more = QArray.new
@data.each {|e|
if (e < @pvalue)
@less.push e
else #includes both equals and greater than
@more.push e
end
}
end
end
arr = QArray.new ([1,5,6,7,9,23,43,2,4,6])
arr.sort
arr.print
我猜这与块中的 e 为 nil 有关。然而,这不应该发生,因为我在调用 dist 之前检查数组是否为空。
为什么会出现此错误,我该如何解决?
您在 dist
中创建了新的 QArray
。
您在 QArray
创建时初始化 @pvalue
,但在 dist
中创建时它们是空的。
在 dist
中你然后尝试使用 @pvalue
,它是 nil,因为你创建的数组是空的并且只有 然后 向它添加值,从不更新未初始化的 @pvalue
值。
无关,但是 QArray
顶部的那些 class 实例变量是做什么用的?!
我试图在 Ruby 中编写快速排序,但我收到一条错误消息:
qsort.rb:43:in `<': comparison of Fixnum with nil failed (ArgumentError)
from qsort.rb:43:in `block in dist'
from qsort.rb:42:in `each'
from qsort.rb:42:in `dist'
from qsort.rb:32:in `sort'
from qsort.rb:34:in `sort'
from qsort.rb:53:in `<main>'
这是我的代码:
#!usr/bin/ruby
class QArray
@data = []
@pvalue
@less
@more
def initialize(arr = [])
@data = arr
@pvalue = @data[0] unless @data.empty?
end
#these methods are so I can treat a QArray like a regular array
def push(value)
@data.push value
end
def empty?
@data.empty?
end
def single?
return @data.size == 1
end
def print
puts @data
end
def sort
puts "starting the sort with an array of #{@data}"
dist unless @data.empty?
@less.sort unless @less.empty? || @less.single?
@more.sort unless @more.empty? || @more.single?
@data = @less + @more #combine the two arrays again
end
def dist
#distributes values into subarrays
@less = QArray.new
@more = QArray.new
@data.each {|e|
if (e < @pvalue)
@less.push e
else #includes both equals and greater than
@more.push e
end
}
end
end
arr = QArray.new ([1,5,6,7,9,23,43,2,4,6])
arr.sort
arr.print
我猜这与块中的 e 为 nil 有关。然而,这不应该发生,因为我在调用 dist 之前检查数组是否为空。
为什么会出现此错误,我该如何解决?
您在 dist
中创建了新的 QArray
。
您在 QArray
创建时初始化 @pvalue
,但在 dist
中创建时它们是空的。
在 dist
中你然后尝试使用 @pvalue
,它是 nil,因为你创建的数组是空的并且只有 然后 向它添加值,从不更新未初始化的 @pvalue
值。
无关,但是 QArray
顶部的那些 class 实例变量是做什么用的?!