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の所有権セマンティクス
