我有一个List
用一个类实现的Node
类。我的#remove!
方法如下:
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上的完整代码
#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