2009-12-29 15 views
5

Me gustaría saber cómo definir un vacío! variable global de tipo Hashtbl en OCaml? No quiero usar Hashtbl.create porque no sé su tamaño inicial y no quiero adivinar el tamaño inicial por motivos de rendimiento.OCaml variable global vacía

Básicamente, esta variable Hashtbl se asignará como una Hashtbl real en una función y luego esta variable se compartirá entre otras funciones, por lo que no quiero pasarla como argumento todo el tiempo, por lo tanto, me gustaría. ser global

Gracias,

Spasski

Respuesta

5

lo que se pide es posible. Puede definir una referencia global (esto le permite asignarla más adelante) a una opción de tabla hash (esto le permite dejarla sin inicializar al principio). La definición se verá así:

let hashtable = ref None 

la inicialización será:

hashtable := Some (Hashtbl.create n) 

Para usarlo, también tendrá que explicar por qué debe ocurrir si no se ha inicializado todavía:

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

En la práctica, las variables no inicializadas van en contra de la filosofía OCaml y solo harán su vida más difícil. Le recomiendo encarecidamente que no use este enfoque. Mis dos sugerencias serían:

  • Determine la pérdida de rendimiento causada por la creación de una tabla hash con un tamaño adivinado. La sobrecarga puede ser mucho más pequeña de lo que piensas.

  • Solo pase la tabla hash en todas partes. Es un solo argumento, que es más corto que una referencia de opción ...

  • Ponga su tabla hash y las funciones usándola en una clase.

6

Hashtables en OCaml crecen cuando se necesita, por lo que sólo puede dar ag mejor conjetura en un primer momento, por ejemplo:

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

Aunque se excede el número inicial pero funcionará sin problemas también, mira esto tutorial para obtener más información http://www.ocaml-tutorial.org/hashtbl