Ruby链表实现#删除!做块无效吗
我有一个用Ruby链表实现#删除!做块无效吗,ruby,scope,linked-list,block,Ruby,Scope,Linked List,Block,我有一个用节点实现的列表类。我的#删除方法如下: def remove!(list_item) find list_item do |i| if i == nil return else i.pointer = i.pointer.pointer end end end #find按照我的预期执行,将节点返回到包含搜索的数据的节点之前。因此,我希望它将前一项的指针设置为指向搜索项之后的对象,这将从列表中删除当前项 我认为这与块的作用域有关
节点实现的列表
类。我的#删除代码>方法如下:
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
您的find
方法从不调用该块,它不会将其存储在任何地方,也不会将其传递给另一个方法,它根本不会对该块执行任何操作。它只是忽略了它。因此,您的删除代码>方法真的很简单
def remove!(list_item)
find list_item
end
您的find
方法如何定位节点,以及这些节点存储/访问的位置/方式?正如您所怀疑的,正在创建对象i
的新副本并将其传递给块。如果不了解数据结构的更多内部内容,就很难具体说明解决方案是什么。