Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby链表实现#删除!做块无效吗_Ruby_Scope_Linked List_Block - Fatal编程技术网

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
的新副本并将其传递给块。如果不了解数据结构的更多内部内容,就很难具体说明解决方案是什么。