我想知道我怎麼定義一個空! OCaml中的Hashtbl類型的全局變量? 我不想使用Hashtbl.create,因爲我不知道它的初始大小,我不想去猜測出於性能考慮初始大小。OCaml的空全局變量
基本上這個Hashtbl變量將在函數中被分配一個真正的Hashtbl,然後這個變量將在其他函數中被共享,所以我不想把它作爲一個參數隨時傳遞,因此我希望它是全球性的。
感謝,
Spasski
我想知道我怎麼定義一個空! OCaml中的Hashtbl類型的全局變量? 我不想使用Hashtbl.create,因爲我不知道它的初始大小,我不想去猜測出於性能考慮初始大小。OCaml的空全局變量
基本上這個Hashtbl變量將在函數中被分配一個真正的Hashtbl,然後這個變量將在其他函數中被共享,所以我不想把它作爲一個參數隨時傳遞,因此我希望它是全球性的。
感謝,
Spasski
你所要求的,是可能的。你可以定義一個全局引用(這可以讓你稍後分配它)到一個散列表選項(這可以讓你一開始就沒有初始化它)。定義將是這樣的:
let hashtable = ref None
初始化將是:
hashtable := Some (Hashtbl.create n)
要使用它,你也將有解釋,如果你還沒有初始化它仍然會發生什麼:
match !hashtable with
| None -> assert false
| Some h -> frobnicate h
在實踐中,未初始化的變量是對OCaml的理念,只會讓你的生活困難。我強烈建議你不要使用這種方法。我的兩個建議是:
確定創建一個猜測大小的哈希表造成的性能損失。開銷可能比您想象的要小得多。
只是通過哈希表中隨處可見。這是一個單一的參數,它是不是一個選擇的參考短...
把你的哈希表,並在使用類的職能。
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