Skip to content

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 обратно на родительский — так цикл разрывается.

Связанные материалы ​