3

我有一个List用一个类实现的Node类。我的#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”方法的行为符合预期,所以我认为这个块必须受到指责。我试图避免两次调用相同的函数,或者声明一个丢弃的变量,因为我对函数式编程很感兴趣并且想尝试一下。

根据请求编辑:

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
4

1 回答 1

0

您的find方法从不调用块,它不会将它存储在任何地方,它不会将它传递给另一个方法,它根本不会对块做任何事情。它只是忽略它。因此,你的remove!方法真的只是

def remove!(list_item)
  find list_item
end
于 2012-10-10T08:09:08.653 回答