OCaml空全局变量

Spa*_*ski 5 ocaml

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

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

谢谢,

Spasski

0xF*_*xFF 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;;
Run Code Online (Sandbox Code Playgroud)

虽然您超过了初始数字但它也能顺利运行,请查看本教程以获取更多信息http://www.ocaml-tutorial.org/hashtbl


Vic*_*let 5

你要求的是可能的.您可以定义全局引用(这允许您稍后将其分配)到哈希表选项(这允许您首先保持未初始化).定义将如下所示:

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的理念,只会让你的生活更加艰难.我强烈建议你不要使用这种方法.我的两个建议是:

  • 确定通过创建具有猜测大小的哈希表导致的性能损失.开销可能比您想象的要小得多.

  • 只需在任何地方传递哈希表.它是一个参数,比选项参考短...

  • 将哈希表和函数放在类中.