我想知道如何定义一个空的!OCaml中Hashtbl类型的全局变量?我不想使用Hashtbl.create,因为我不知道它的初始大小,我不想因性能原因猜测初始大小.
基本上这个Hashtbl变量将在函数中被赋予真正的Hashtbl,然后这个变量将在其他函数之间共享,所以我不想一直作为参数传递它因此我希望它是全局的.
谢谢,
Spasski
OCaml中的哈希表会根据需要增长,因此您可以先给出最好的猜测,例如:
module A
let hash = Hashtbl.create 123;;
...
let exceed_hash () =
for i = 1 to 555 do
Hashtbl.add hash i (string_of_int i)
done;;
Run Code Online (Sandbox Code Playgroud)
虽然您超过了初始数字但它也能顺利运行,请查看本教程以获取更多信息http://www.ocaml-tutorial.org/hashtbl
你要求的是可能的.您可以定义全局引用(这允许您稍后将其分配)到哈希表选项(这允许您首先保持未初始化).定义将如下所示:
let hashtable = ref None
Run Code Online (Sandbox Code Playgroud)
初始化将是:
hashtable := Some (Hashtbl.create n)
Run Code Online (Sandbox Code Playgroud)
要使用它,您还必须解释如果尚未初始化它会发生什么:
match !hashtable with
| None -> assert false
| Some h -> frobnicate h
Run Code Online (Sandbox Code Playgroud)
在实践中,未初始化的变量违反了OCaml的理念,只会让你的生活更加艰难.我强烈建议你不要使用这种方法.我的两个建议是:
确定通过创建具有猜测大小的哈希表导致的性能损失.开销可能比您想象的要小得多.
只需在任何地方传递哈希表.它是一个参数,比选项参考短...
将哈希表和函数放在类中.