Я хотел бы знать, как делают я определяю пустое! глобальная переменная типа Hashtbl в OCaml? Я не хочу использовать Hashtbl.create, потому что я не знаю его начального размера, и я не хочу предполагать начальный размер по причинам производительности.
В основном эта переменная Hashtbl будет assigjned реальный Hashtbl в функции, и затем эта переменная будет общими для другими функциями, таким образом, я не захочу раздавать его как аргумент все время следовательно, я хотел бы, чтобы это было глобально.
Спасибо,
Spasski
То, что вы просите, возможно. Вы можете определить глобальную ссылку (это позволит вам назначить ее позже) на опцию хэш-таблицы (это позволит вам оставить ее неинициализированной вначале). Определение будет выглядеть следующим образом:
let hashtable = ref None
Инициализация будет:
hashtable := Some (Hashtbl.create n)
Чтобы использовать его, вам также нужно будет объяснить, что должно произойти, если вы еще не инициализировали его:
match !hashtable with
| None -> assert false
| Some h -> frobnicate h
На практике, неинициализированные переменные противоречат философии OCaml и только усложнят вам жизнь. Я настоятельно рекомендую Вам не использовать этот подход. Двумя моими предложениями было бы:
Определить потерю производительности, вызванную созданием хэш-таблицы с угаданным размером. Накладные расходы могут быть намного меньше, чем вы думаете.
Просто передайте хэш-таблицу повсюду. Это единственный аргумент, который короче, чем ссылка на опцию...
Поместите вашу хэш-таблицу и функции, использующие ее, в класс.
Хэш-таблицы в 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