Ответсообщение недоступно
До релиза осталось 0.83.0 версий!
💡 Мысли вслух: как мог бы выглядеть родной Borrow Checker в Zig?
🔑 Главная идея: Lifetimes как comptime Scope
1. Функции с лайфтаймами
fn choose(
comptime lt: std.builtin.Scope,
x: *scope(lt) const i32,
y: *scope(lt) const i32,
) *scope(lt) const i32 {
return if (x.* == y.*) x else y;
}
2. Структуры, хранящие ссылки
fn Parser(comptime lt: std.builtin.Scope) type {
return struct {
text: *scope(lt) const []const u8,
pos: usize,
};
}
// Использование:
const text = "hello";
var p = Parser(@scopeOf(text)){
.text = &text,
.pos = 0,
};
3. Проверка правил (Aliasing)
var data: i32 = 42;
const r1: *scopeOf(data) const i32 = &data;
// Ошибка компиляции: нельзя взять изменяемую ссылку,
// пока жива константная r1
var mut_r = &data;
4. Отношение «одно время жизни длиннее другого» (Outlives)
fn processData(
comptime lt_inner: std.builtin.Scope,
comptime lt_outer: std.builtin.Scope,
inner: *scope(lt_inner) const Data,
outer: *scope(lt_outer) const Data,
) void {
// Явное и понятное требование: lt_outer должен жить дольше или столько же, сколько lt_inner
comptime {
@compileDeclare(lt_outer.outlives(lt_inner));
}
// ...
}
Как вам такой концепт? Имеет право на жизнь в альтернативной вселенной Zig 1.0? 👇