2012-10-10 21 views
3

我有一个List类用Node类实现。我#remove!方法如下:Ruby链表实现#remove! do block ineffectual

def remove!(list_item) 
    find list_item do |i| 
    if i == nil 
     return 
    else 
     i.pointer = i.pointer.pointer 
    end 
    end 
end 

#find确实如我所料,回到以前含有一个基准搜索的节点。所以我期望这样做可以在搜索到的项目之后设置上一个项目的指针,该项目应该从列表中删除当前项目。

我认为这与块的作用域有关,而且传递给块的i不是直接引用它应该在块中的对象,因此不能覆盖它的指针值。我怎么能强制这个块改变这个值,而没有显式地声明这个值(这会破坏这个块的用途)。

#find方法和'#traverse'方法的行为与预期的一样,所以我认为这个块是责任。我试图避免两次进行相同的函数调用,或者声明一个抛出变量,因为我对函数式编程感兴趣,并且想尝试一下。每个请求

编辑:

在github

full code#find方法

def find(item_to_find, current_item = @sentinel.pointer, previous_item = @sentinel) 
    if current_item == @sentinel then puts "not found"; return nil end 
    if current_item.datum == item_to_find 
    return previous_item 
    else 
    find item_to_find, current_item.pointer, current_item 
    end 
end 
+2

请问你'find'方法找到一个节点,并在那里/如何存储这些节点/访问?正如你怀疑的那样,一个新的对象'i'正在创建并传递给该块。如果不知道数据结构的更多内部信息,很难详细说明解决方案。 – pje

回答

0

find方法永远不会调用该块,它不会存储任何地方,它不没有把它传递给另一种方法,它根本就没有做任何事情。它只是忽略它。因此,你的remove!方法实际上只是

def remove!(list_item) 
    find list_item 
end