2014-03-13 32 views
0

我正在尝试创建一个插入排序。我遇到了NoMethodError,我正在寻找一些帮助。创建插入排序在Ruby中

def insertion_sort array 
    (1..array.length-1).each do |pull_position| 
    checked_value = array.delete(pull_position) 
    insert_point = pull_position 

    while checked_value < array[insert_point - 1] and insert_point >= 0 do 
     insert_point -= 1 
    end 

    array.insert(insert_point,checked_value) 
    end 
end 


puts insertion_sort(["goof","fire","apple","charlie","banana","elephant","dog"]) 
+0

当询问引发的异常时,精确显示异常情况(剪切和粘贴)以及发生的位置总是有帮助的。我建议你编辑添加该信息。 –

回答

2

的问题是,pull_position不是array的元件。 (这是一个索引。)所以array.delete(pull_position)返回nil,它被分配到checked_valuechecked_value < array ...引发异常,因为nil没有方法<

而不是array.delete(pull_position)我希望你想要array.delete_at(pull_position),虽然这还不足以解决代码。

的问题是容易被发现,当我跑的代码,并得到这个异常:

NoMethodError: undefined method `<' for nil:NilClass 
    from (irb):39:in `block in insertion_sort' 
     ... 

这是有价值的信息。它告诉我,当

while checked_value < array[insert_point - 1] and insert_point >= 0 do 

被处决发生异常和checked_value等于nil。所以这只是看看checked_value上次分配的值(nil)和宾果!