Связывания явно задают mutability, compile-time вычисление, destructuring, lexical lifetime, shadowing и capture замыкания, а не выводят их из случайного присваивания.
Политика
let pattern = expression создаёт неизменяемые lexical bindings и допускает destructuring только для разрешённого pattern. let mut name = expression создаёт одну mutable cell только для bare identifier. const name = const-expression вычисляется ограниченной constant-грамматикой. Области lexical: внутренний блок может затенить внешнее имя, но повтор в той же области запрещён.
Определённое поведение
Неизменяемый capture остаётся read-only. Лямбда, захватившая mutable binding, видит ту же cell; допустимые присваивания сохраняются между вызовами, а cell живёт, пока нужна замыканию. Pattern bindings неизменяемы и ограничены успешной ветвью или итерацией. using name = fileExpression { body } создаёт один неизменяемый File в дочерней области и регистрирует implicit close после успешного acquisition.
Ограничения и явный отказ
mut let отклоняется; канонично только let mut. Нельзя присваивать immutable let, const, параметрам и pattern bindings. using принимает одно неаннотированное bare name и один проверенный File: без destructuring, нескольких ресурсов, mutable, as, общего close-протокола и значения выражения. Refutable pattern нельзя использовать в обычном let, если позиция не доказывает его irrefutable.
Отложенная граница
Явные capture lists, move capture, Rust closure traits, borrow receivers, общий disposable protocol, asynchronous cleanup и гарантии host exception после close находятся вне контракта. Замыкание сохраняет lexical Topaz cells, а не синтаксис владения целевого языка.
Пример
function makeAdder(base: int) -> (int) -> int {
return value => value + base
}
const DEFAULT_STEP = 5
let addStep = makeAdder(DEFAULT_STEP)
let mut total = 0
total = addStep(total)