std.weak
Модуль слабых ссылок, используется совместно с Arc для разрыва циклов ссылок.
use std.weakДанный модуль зависит от атомарного подсчёта ссылок и не экспортируется для целевой платформы
wasm32.
Обзор функций
| Функция | Сигнатура |
|---|---|
new | (T: Type)(arc: Arc(T)) -> Weak(T) |
upgrade | (T: Type)(weak: Weak(T)) -> Option(Arc(T)) |
Функции
new
new: (T: Type)(arc: Arc(T)) -> Weak(T)Создаёт соответствующую слабую ссылку из Arc.
arc— значение сильной ссылки; передаётся по значению, перемещается после вызова.
Возвращает: дескриптор Weak, указывающий на тот же блок выделения, не увеличивая счётчик сильных ссылок.
use std.assert
use std.weak
main: () -> Void = {
// ref создаёт Arc[Int]
p = ref 42
// Arc → Weak регистрация
w = weak.new(p)
assert(true)
}upgrade
upgrade: (T: Type)(weak: Weak(T)) -> Option(Arc(T))Пытается повысить слабую ссылку до сильной.
weak— дескриптор слабой ссылки.
Возвращает: Option.some(Arc), если блок выделения всё ещё жив, и Option.none(), если он уже освобождён. Не возвращает ошибку — для выражения факта «существует ли ещё цель» используется Option.
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
