2009-12-29 72 views
5

我想知道我怎么定义一个空! OCaml中的Hashtbl类型的全局变量? 我不想使用Hashtbl.create,因为我不知道它的初始大小,我不想去猜测出于性能考虑初始大小。OCaml的空全局变量

基本上这个Hashtbl变量将在函数中被分配一个真正的Hashtbl,然后这个变量将在其他函数中被共享,所以我不想把它作为一个参数随时传递,因此我希望它是全球性的。

感谢,

Spasski

回答

5

你所要求的,是可能的。你可以定义一个全局引用(这可以让你稍后分配它)到一个散列表选项(这可以让你一开始就没有初始化它)。定义将是这样的:

let hashtable = ref None 

初始化将是:

hashtable := Some (Hashtbl.create n) 

要使用它,你也将有解释,如果你还没有初始化它仍然会发生什么:

match !hashtable with 
    | None -> assert false 
    | Some h -> frobnicate h 

在实践中,未初始化的变量是对OCaml的理念,只会让你的生活困难。我强烈建议你不要使用这种方法。我的两个建议是:

  • 确定创建一个猜测大小的哈希表造成的性能损失。开销可能比您想象的要小得多。

  • 只是通过哈希表中随处可见。这是一个单一的参数,它是不是一个选择的参考短...

  • 把你的哈希表,并在使用类的职能。

6

Hashtable中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