我有一个使用
我认为这与块作用域有关,传递给块的
Node
类实现的List
类。我的#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' 方法的行为符合预期,因此我认为这个块必须受到责备。我正在尝试避免两次进行相同的函数调用或声明一个丢弃的变量,因为我对函数式编程产生了兴趣,并想尝试一下。
根据请求编辑:
完整代码
#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
方法如何定位一个节点,这些节点在哪里/如何存储和访问?正如你所怀疑的那样,对象i
的新副本被创建并传递给了代码块。如果不了解数据结构的一些内部细节,很难具体说明解决方案是什么。 - pje