2009-12-29 33 views
5

Boş bir alanı nasıl tanımlarım? OCaml içinde Hashtbl türünün global değişkeni? Hashtbl.create'i kullanmak istemiyorum çünkü başlangıç ​​boyutunu bilmiyorum ve performans nedenleriyle başlangıç ​​boyutunu tahmin etmek istemiyorum.OCaml global değişkeni değişkeni

Temel olarak, bu Hashtbl değişkeni, bir fonksiyonda gerçek bir Hashtbl ifadesine dönüştürülecek ve bu değişken diğer işlevler arasında paylaşılacaktır. Bu yüzden, her zaman bir argüman olarak iletmek istemiyorum, bundan dolayı küresel ol.

sayesinde

Spasski

cevap

5

Ne sormak mümkündür. Genel bir referans tanımlayabilirsiniz (bu daha sonra atamanıza olanak sağlar) bir karma tablo seçeneğine (bu, ilk önce başlatılmamış halde bırakmanızı sağlar). tanımı aşağıdaki gibi görünecektir:

let hashtable = ref None 

başlatma olacaktır:

hashtable := Some (Hashtbl.create n) 

Kullanmak için, ayrıca henüz başlatılmadı varsa ne olacağına açıklamak zorunda kalacak:

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

Pratikte, başlatılmamış değişkenler OCaml felsefesine aykırıdır ve sadece hayatınızı daha da zorlaştıracaktır. Bu yaklaşımı kullanmamanızı şiddetle tavsiye ediyorum. Benim iki önerim:

  • Tahmini bir büyüklükte bir karma tablo oluşturmanın neden olduğu performans kaybını belirleyin. Tepegöz sandığından çok daha küçük olabilir.

  • Yalnızca karma tabloyu her yere iletin. Bir seçenek referansından daha kısa olan tek bir argüman var ...

  • Karma masanızı ve fonksiyonlarını bir sınıfta kullanın. örneğin, gerektiği gibi OCaml içinde

6

Hashtables büyümek, böylece sadece ilk başta ag'yi iyi tahminde verebilir: Eğer ilk sayısını aşan ama çok sorunsuz çalışacaktır rağmen

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;; 

Bunu denetlemek daha fazla bilgi için öğretici http://www.ocaml-tutorial.org/hashtbl

İlgili konular