2009-12-29 31 views
5

Chciałbym wiedzieć, jak zdefiniować puste! zmienna globalna typu Hashtbl w OCaml? Nie chcę używać Hashtbl.create, ponieważ nie znam jego początkowego rozmiaru i nie chcę odgadnąć rozmiaru początkowego ze względu na wydajność.OCaml pusta zmienna globalna

Zasadniczo ta zmienna Hashtbl zostanie przypisana do prawdziwej funkcji Hashtbl w funkcji, a następnie ta zmienna zostanie udostępniona innym funkcjom, więc nie chcę przekazywać jej jako argumentu przez cały czas, dlatego chciałbym, aby być globalnym.

Dzięki,

Spasski

Odpowiedz

5

co prosisz jest możliwy. Możesz zdefiniować globalną referencję (pozwala to później ją przypisać) do tabeli mieszania (pozwala to na pozostawienie jej niezainicjowanej na początku). Definicja będzie wyglądać następująco:

let hashtable = ref None 

Inicjalizacja będą:

hashtable := Some (Hashtbl.create n) 

Aby z niego skorzystać, trzeba będzie również wyjaśnić, co powinno się zdarzyć, jeśli nie zainicjowany go jeszcze:

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

W praktyce niezainicjowane zmienne są sprzeczne z filozofią OCaml i tylko utrudnią ci życie. Zdecydowanie radzę nie stosować tego podejścia. Moje dwie sugestie to:

  • Określa utratę wydajności spowodowaną tworzeniem tabeli mieszania o zgadywanym rozmiarze. Obciążenie może być znacznie mniejsze niż myślisz.

  • Po prostu podaj tabelę skrótów wszędzie. Jest to pojedynczy argument, który jest krótszy niż odniesienie do opcji ...

  • Umieść tabelę skrótów i funkcje wykorzystujące je w klasie.

6

Hashtables w SML rosnąć w miarę potrzeb, więc można po prostu dać AG najbardziej prawdopodobne na początku, na przykład:

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

Chociaż przekraczać liczby początkowej ale to będzie działać płynnie też sprawdzić samouczek, aby uzyskać więcej informacji http://www.ocaml-tutorial.org/hashtbl