OCaml空全局变量
我想知道如何定义空的!OCaml中Hashtbl类型的全局变量? 我不想使用Hashtbl.create,因为我不知道它的初始大小,也不想因为性能原因猜测它的初始大小 基本上,这个Hashtbl变量将在一个函数中被分配为一个实Hashtbl,然后这个变量将在其他函数中共享,所以我不想一直将它作为参数传递,因此我希望它是全局的 谢谢OCaml空全局变量,ocaml,Ocaml,我想知道如何定义空的!OCaml中Hashtbl类型的全局变量? 我不想使用Hashtbl.create,因为我不知道它的初始大小,也不想因为性能原因猜测它的初始大小 基本上,这个Hashtbl变量将在一个函数中被分配为一个实Hashtbl,然后这个变量将在其他函数中共享,所以我不想一直将它作为参数传递,因此我希望它是全局的 谢谢 斯帕斯基你的要求是可能的。您可以为哈希表选项定义一个全局引用(这使您可以在以后分配它)(这使您可以在一开始不初始化它)。定义如下所示: let hashtable =
斯帕斯基你的要求是可能的。您可以为哈希表选项定义一个全局引用(这使您可以在以后分配它)(这使您可以在一开始不初始化它)。定义如下所示:
let hashtable = ref None
初始化将是:
hashtable := Some (Hashtbl.create n)
要使用它,您还必须解释如果尚未初始化它会发生什么:
match !hashtable with
| None -> assert false
| Some h -> frobnicate h
在实践中,未初始化的变量与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;;
虽然您超过了初始数量,但它也会顺利工作,请查看本教程以了解更多信息