Hashtbl 删除如何恢复以前的绑定。
Hashtbl.add t key1
Hashtbl.remove t key1
Hashtbl.remove t key1 => This should do anything but not restore the key1 !
无论如何,我怎么能删除某些东西以确保并且如果它在之前被删除,那么应该遵循适当的流程?
Hashtbl 删除如何恢复以前的绑定。
Hashtbl.add t key1
Hashtbl.remove t key1
Hashtbl.remove t key1 => This should do anything but not restore the key1 !
无论如何,我怎么能删除某些东西以确保并且如果它在之前被删除,那么应该遵循适当的流程?
有两种合法的使用模式Hashtbl
:总是使用Hashtbl.replace
,这确保每个键在表中只有一个绑定,或者使用表作为多重映射(每个键指向值列表)Hasthbl.add
,Hashtbl.find
和Hashtbl.find_all
。
请确保您了解您感兴趣的使用模式。如果您不想保留旧绑定,则将多个绑定添加到同一个键是没有意义的(这可能会导致性能问题、内存泄漏和堆栈溢出);在这种情况下,您应该使用Hashtbl.replace
而不是Hashtbl.add
,并且Hashtbl.remove
会完全按照您的期望进行。
如果您将哈希表用作多重映射,并且想要一个删除键的所有绑定的函数,您可以自己实现它(代码未经测试):
let rec remove_all tbl key =
if Hashtbl.mem tbl key then begin
Hashtbl.remove tbl key;
remove_all tbl key
end
编辑:我刚刚明白阅读您的(难以理解)问题的另一种方式是“我怎样才能确保表中有一个要删除的键,而不是在remove
被调用时默默地什么都不做?”。cago 为此提供了一个代码片段,本质上您可以Hashtbl.mem
在假设绑定应该存在时使用它来检查绑定是否存在。
如果您使用Hashtbl.replace
而不是,Hashtbl.add
您将替换t
. 所以这个功能Hashtbl.remove
不会恢复任何东西。
您还可以编写自己的删除函数:
let remove tbl key =
if Hashtbl.mem tbl key then Hashtbl.remove tbl key
else raise Nothing_to_remove_in_the_hashtbl
Hashtbl.replace t key1 value;;
remove t key1;;
remove t key1;; (* raise Nothing_to_remove_in_the_hashtbl *)