Модуль Weak
module Weak: sig .. end
Массивы слабых указателей и хеш-множества слабых указателей.
Низкоуровневые функции
type !'a t
Тип массивов слабых указателей (слабых массивов). Слабый указатель — это значение, которое сборщик мусора может удалить, когда программа больше не использует это значение (через обычные указатели). Обратите внимание, что функции финализации выполняются до удаления слабых указателей, поскольку функции финализации могут снова сделать значения живыми (до версии 4.03 функции финализации выполнялись после удаления).
Слабый указатель считается заполненным, если он указывает на значение, и пустым, если значение было удалено сборщиком мусора.
Примечания:
- Целые числа не выделяются в куче и не могут храниться в слабых массивах.
- Слабые массивы нельзя сериализовать с помощью
output_valueили функций модуляMarshal.
val create : int -> 'a t
Weak.create n возвращает новый слабый массив длины n. Изначально все указатели пусты.
-
Вызывает исключение
Invalid_argument, еслиnне находится в диапазоне от нуля доObj.Ephemeron.max_ephe_lengthвключительно.
val length : 'a t -> int
Weak.length ar возвращает длину (число элементов) ar.
val set : 'a t -> int -> 'a option -> unit
Weak.set ar n (Some el) устанавливает в ar ячейку с индексом n, чтобы она содержала (заполненный) указатель на el; Weak.set ar n None устанавливает ячейку с индексом n в ar как пустую.
-
Вызывает исключение
Invalid_argument, еслиnне входит в диапазон от 0 доWeak.lengthar - 1.
val get : 'a t -> int -> 'a option
Weak.get ar n возвращает None, если ячейка с индексом n в ar пуста, и Some x (где x — это значение), если она заполнена.
-
Вызывает исключение
Invalid_argument, еслиnне входит в диапазон от 0 доWeak.lengthar - 1.
val get_copy : 'a t -> int -> 'a option
Weak.get_copy ar n возвращает None, если ячейка с индексом n в ar пуста, и Some x (где x — это (поверхностная) копия значения), если она заполнена. Помимо подводных камней, связанных с изменяемыми значениями, интересное отличие от get состоит в том, что get_copy не предотвращает удаление значения инкрементальным сборщиком мусора в текущем цикле (get может отложить удаление до следующего цикла сборки мусора).
-
Вызывает исключение
Invalid_argument, еслиnне входит в диапазон от 0 доWeak.lengthar - 1. Если элемент является пользовательским блоком, он не копируется.
val check : 'a t -> int -> bool
Weak.check ar n возвращает true, если ячейка с индексом n в ar заполнена, и false, если она пуста. Обратите внимание: даже если Weak.check ar n возвращает true, последующий вызов Weak.get ar n может вернуть None.
-
Вызывает исключение
Invalid_argument, еслиnне входит в диапазон от 0 доWeak.lengthar - 1.
val fill : 'a t -> int -> int -> 'a option -> unit
Weak.fill ar ofs len el устанавливает в el все указатели в ar начиная с ofs и заканчивая ofs + len - 1.
-
Вызывает исключение
Invalid_argument, еслиofsиlenне задают допустимый подмассивar.
val blit : 'a t -> int -> 'a t -> int -> int -> unit
Weak.blit ar1 off1 ar2 off2 len копирует len слабых указателей из ar1 (начиная с off1) в ar2 (начиная с off2). Функция работает корректно, даже если ar1 и ar2 совпадают.
-
Вызывает исключение
Invalid_argument, еслиoff1иlenне задают допустимый подмассивar1или еслиoff2иlenне задают допустимый подмассивar2.
Слабые хеш-множества
Слабое хеш-множество — это хешированное множество значений. Каждое значение может незаметно исчезнуть из множества, когда остальная часть программы больше его не использует. Обычно это используется для совместного использования структур данных без утечек памяти. Слабые хеш-множества определяются для значений из модуля Hashtbl.HashedType; отношение equal и функция hash берутся из этого модуля. Будем говорить, что v является экземпляром x, если equal x v — это true.
Отношение equal должно работать с поверхностной копией значений и давать тот же результат, что и для самих значений.
Несинхронизированный доступ
Несинхронизированный доступ к слабым хеш-множествам является ошибкой программирования. Такой доступ может привести к некорректному состоянию слабого хеш-множества. Поэтому параллельный доступ к слабым хеш-множествам должен быть синхронизирован (например, с помощью Mutex.t).
module type S = sig .. end
Выходная сигнатура функтора Weak.Make.
module Make: functor (H : Hashtbl.HashedType) -> S with type data = H.t
Функтор, создающий реализацию структуры слабого хеш-множества.
© 1995-2026 INRIA.
https://ocaml.org/manual/5.5/api/Weak.html