2009-12-29 155 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