Hashtbl如何删除恢复先前的绑定。
Hashtbl.add t key1
Hashtbl.remove t key1
Hashtbl.remove t key1 => This should do anything but not restore the key1 !
无论如何,为什么我可以删除确定的东西,如果它被删除,那么应该遵循适当的流程?
答案 0 :(得分:6)
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
编辑:我只是理解另一种阅读(难以理解)问题的方法是“如何确保在表格中删除密钥,而不是在remove
时默默无效叫什么名字?”。 cago为此提供了一个代码片段,实际上,当您认为绑定存在时,您可以使用Hashtbl.mem
检查绑定是否存在。
答案 1 :(得分:2)
如果您使用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 *)