模块 Weak

module Weak: sig .. end

弱指针数组和弱指针哈希集。


底层函数

type !'a t 

弱指针数组(弱数组)的类型。弱指针是一个值,当程序不再通过普通指针使用该值时,垃圾收集器可能会擦除它。请注意,在弱指针被擦除之前会运行终结函数,因为终结函数可以使值再次存活(在 4.03 之前,终结函数是在之后运行的)。

如果弱指针指向一个值,则称其为满的;如果该值被 GC 擦除,则称其为空的。

备注

  • 整数不会被分配,也不能存储在弱数组中。
  • 弱数组不能使用 output_valueMarshal 模块的函数进行编组。
val create : int -> 'a t

Weak.create n 返回一个长度为 n 的新弱数组。所有指针最初都为空。

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 Nonear 的第 n 个单元格设置为空。

val get : 'a t -> int -> 'a option

Weak.get ar n 如果 ar 的第 n 个单元格为空,则返回 None;如果它为满,则返回 Some x(其中 x 是值)。

val get_copy : 'a t -> int -> 'a option

Weak.get_copy ar n 如果 ar 的第 n 个单元格为空,则返回 None;如果它为满,则返回 Some x(其中 x 是值的(浅)副本)。除了可变值带来的陷阱之外,与 get 的有趣区别在于,get_copy 不会阻止增量 GC 在其当前循环中擦除该值(get 可能会将擦除延迟到下一个 GC 循环)。

val check : 'a t -> int -> bool

Weak.check ar n 如果 ar 的第 n 个单元格为满,则返回 true;如果它为空,则返回 false。请注意,即使 Weak.check ar n 返回 true,随后的 Weak.get ar n 仍可能返回 None

val fill : 'a t -> int -> int -> 'a option -> unit

Weak.fill ar ofs len elarofsofs + len - 1 的所有指针设置为 el

val blit : 'a t -> int -> 'a t -> int -> int -> unit

Weak.blit ar1 off1 ar2 off2 lenlen 个弱指针从 ar1(从 off1 开始)复制到 ar2(从 off2 开始)。即使 ar1ar2 相同,它也能正常工作。

弱哈希集

弱哈希集是值的哈希集。每个值在程序的其余部分不再使用它时,都可能从集合中神奇地消失。这通常用于共享数据结构,而不会导致内存泄漏。弱哈希集是在来自 Hashtbl.HashedType 模块的值上定义的;equal 关系和 hash 函数取自该模块。如果 equal x vtrue,我们将说 vx 的实例。

equal 关系必须能够处理值的浅拷贝,并给出与值本身相同的结果。

非同步访问

对弱哈希集的非同步访问是编程错误。对弱哈希集的非同步访问可能导致弱哈希集状态无效。因此,对弱哈希集的并发访问必须同步(例如使用 Mutex.t)。

module type S = sig .. end

函子 Weak.Make 的输出签名。

module Make: 
functor (H : Hashtbl.HashedType-> S with type data = H.t

构建弱哈希集结构实现的函子。