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