ocaml hashtbl删除功能

bla*_*ath 0 ocaml

为什么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)

无论如何,为什么我可以删除确定的东西,如果它被删除,那么应该遵循适当的流程?

val remove:('a,'b)t - >'a - > unit Hashtbl.remove tbl x删除tbl中x的当前绑定,恢复先前绑定(如果存在).如果x没有绑定在tbl中,它什么都不做.

gas*_*che 6

有两种合法的使用模式Hashtbl:始终使用Hashtbl.replace,它确保每个键只在表中有一个绑定,或者使用表作为多映射(每个键指向一个值列表)Hasthbl.add,Hashtbl.findHashtbl.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当您认为绑定存在时,您可以使用它来检查绑定是否存在.