OCaml空全局变量

OCaml空全局变量,ocaml,Ocaml,我想知道如何定义空的!OCaml中Hashtbl类型的全局变量? 我不想使用Hashtbl.create,因为我不知道它的初始大小,也不想因为性能原因猜测它的初始大小 基本上,这个Hashtbl变量将在一个函数中被分配为一个实Hashtbl,然后这个变量将在其他函数中共享,所以我不想一直将它作为参数传递,因此我希望它是全局的 谢谢 斯帕斯基你的要求是可能的。您可以为哈希表选项定义一个全局引用(这使您可以在以后分配它)(这使您可以在一开始不初始化它)。定义如下所示: let hashtable =

我想知道如何定义空的!OCaml中Hashtbl类型的全局变量? 我不想使用Hashtbl.create,因为我不知道它的初始大小,也不想因为性能原因猜测它的初始大小

基本上,这个Hashtbl变量将在一个函数中被分配为一个实Hashtbl,然后这个变量将在其他函数中共享,所以我不想一直将它作为参数传递,因此我希望它是全局的

谢谢


斯帕斯基

你的要求是可能的。您可以为哈希表选项定义一个全局引用(这使您可以在以后分配它)(这使您可以在一开始不初始化它)。定义如下所示:

let hashtable = ref None
初始化将是:

hashtable := Some (Hashtbl.create n)
要使用它,您还必须解释如果尚未初始化它会发生什么:

match !hashtable with 
  | None -> assert false
  | Some h -> frobnicate h
在实践中,未初始化的变量与OCaml哲学背道而驰,只会让你的生活更加艰难。我强烈建议你不要使用这种方法。我的两项建议是:

  • 确定由于创建具有猜测大小的哈希表而导致的性能损失。开销可能比你想象的要小得多

  • 只要把散列表到处传递就行了。它是一个单参数,比选项引用短

  • 将哈希表和使用它的函数放在一个类中


OCaml中的哈希表会根据需要增长,因此您可以首先给出g最佳猜测,例如:

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;;
虽然您超过了初始数量,但它也会顺利工作,请查看本教程以了解更多信息