gpt4 book ai didi

Ruby 链表实现 #remove!阻止无效

转载 作者:数据小太阳 更新时间:2023-10-29 08:13:06 24 4
gpt4 key购买 nike

我有一个用 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 如我所料,返回包含所搜索数据的节点之前的节点。所以我希望这会将前一个项目的指针设置为搜索项目之后的对象,这应该从列表中删除当前项目。

我认为这与 block 作用域的方式有关,传递给 block 的 i 没有直接引用它应该在 block 中的对象,因此不能覆盖其指针的值.我怎样才能强制这个 block 改变这个值,而不事先明确声明这个值(这违背了这个 block 的目的)。

#find 方法和“#traverse”方法的行为符合预期,所以我认为这个 block 必须是罪魁祸首。我试图避免对同一个函数进行两次调用,或者声明一个一次性变量,因为我对函数式编程很感兴趣并且想尝试一下。

根据请求编辑:

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

最佳答案

您的 find 方法从不调用该 block ,它不会将它存储在任何地方,它不会将它传递给另一个方法,它根本不对该 block 执行任何操作。它只是忽略它。因此,您的 remove! 方法实际上只是

def remove!(list_item)
find list_item
end

关于Ruby 链表实现 #remove!阻止无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12810401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com