std.weak
弱引用模块,配合 Arc 使用以打破引用环。
yaoxiang
use std.weak本模块依赖原子引用计数,在
wasm32目标上不导出。
函数一览
| 函数 | 签名 |
|---|---|
new | (T: Type)(arc: Arc(T)) -> Weak(T) |
upgrade | (T: Type)(weak: Weak(T)) -> Option(Arc(T)) |
函数
new
yaoxiang
new: (T: Type)(arc: Arc(T)) -> Weak(T)由 Arc 创建其对应的弱引用。
arc—— 强引用值;按值传入,调用后即被移动
返回:指向同一分配块的 Weak 句柄,不增加强引用计数。
yaoxiang
use std.assert
use std.weak
main: () -> Void = {
// ref 创建 Arc[Int]
p = ref 42
// Arc → Weak 登记
w = weak.new(p)
assert(true)
}upgrade
yaoxiang
upgrade: (T: Type)(weak: Weak(T)) -> Option(Arc(T))尝试把弱引用提升为强引用。
weak—— 弱引用句柄
返回:分配块仍存活时为 Option.some(Arc),已释放时为 Option.none()。 不报错——用 Option 表达“目标是否还在”。
yaoxiang
use std.assert
use std.weak
main: () -> Void = {
p = ref 42
w = weak.new(p)
// 目标存活:得到 some 变体
u = weak.upgrade(w)
assert(true)
}语法限制:
Option的变体解构(match some(v))语法尚未落地,因此目前只能验证调用成功,无法在源码里分支处理some/none。参见src/std/tests/weak_ops.yx的说明。
语义说明
弱引用不持有所有权:Weak 存在不阻止目标被释放。典型用途是打破循环引用——父节点持 Arc 指向子节点,子节点只持 Weak 指回父节点,环即断开。
相关
- 语言规范:类型系统 ——
Arc/Weak的所有权语义
