Ruby 链表实现 #remove! do 块无效

3
我有一个使用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

2
你的find方法如何定位一个节点,这些节点在哪里/如何存储和访问?正如你所怀疑的那样,对象i的新副本被创建并传递给了代码块。如果不了解数据结构的一些内部细节,很难具体说明解决方案是什么。 - pje
1个回答

0

你的find方法从未调用块,也未将其存储在任何位置,也未将其传递给其他方法,它根本不会对该块执行任何操作。它只是忽略了它。因此,你的remove!方法实际上就是这样的:

def remove!(list_item)
  find list_item
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接