为什么Hashtbl删除恢复以前的绑定.
Hashtbl.add t key1
Hashtbl.remove t key1
Hashtbl.remove t key1 => This should do anything but not restore the key1 !
Run Code Online (Sandbox Code Playgroud)
无论如何,为什么我可以删除确定的东西,如果它被删除,那么应该遵循适当的流程?
有两种合法的使用模式Hashtbl:始终使用Hashtbl.replace,它确保每个键只在表中有一个绑定,或者使用表作为多映射(每个键指向一个值列表)Hasthbl.add,Hashtbl.find和Hashtbl.find_all.
请确保您了解您感兴趣的使用模式.如果您不想保留旧的绑定,则无需为同一个键添加多个绑定(这可能会导致性能问题,内存泄漏和堆栈溢出); 在这种情况下,你应该使用Hashtbl.replace而不是Hashtbl.add,并将Hashtbl.remove完全按照你的期望.
如果您将哈希表用作多映射,并且想要一个删除键的所有绑定的函数,则可以将其实现为yourslef(代码未经测试):
let rec remove_all tbl key =
if Hashtbl.mem tbl key then begin
Hashtbl.remove tbl key;
remove_all tbl key
end
Run Code Online (Sandbox Code Playgroud)
编辑:我只是明白另一种阅读你(难以理解)问题的方法是"我如何确保在表格中有一个要删除的键,而不是在remove调用时默默地做什么?".cago为此提供了一个代码片段,实际上,Hashtbl.mem当您认为绑定存在时,您可以使用它来检查绑定是否存在.