Size: a a a

2021 April 04

H

Hirrolot in rust_offtopic
источник

EG

Emmanuel Goldstein in rust_offtopic
Например,
fn foo(a: &i32) -> &i32 { a }

это
impl for<'a> Fn(&'a i32) -> &'a i32
источник

EG

Emmanuel Goldstein in rust_offtopic
Фактически, это способ записать тип функции, которая дженерик по лайфтайму
источник

EG

Emmanuel Goldstein in rust_offtopic
Суть в том, что ты принимаешь функцию с типом for<'id> FnOnce(&'id Foo<'id>), где 'id — инвариантный лайфтайм
источник

EG

Emmanuel Goldstein in rust_offtopic
И потом делаешь метод, из которого выдаёшь какие-нибудь другие штуки с лайфтаймом 'id
источник

EG

Emmanuel Goldstein in rust_offtopic
Например, у тебя есть вектор, и ты выдаёшь из него тип Index<'id>(usize), который гарантировано in bounds
источник

EG

Emmanuel Goldstein in rust_offtopic
Из-за инвариантного лайфтайма, клиент не может получить индекс с лайфтаймом 'id из другого вектора
источник

EG

Emmanuel Goldstein in rust_offtopic
Соответственно, если тебе передают Index<'id>(usize), то ты можешь быть уверен, что этот индекс ты сам выписал, и безопасно сделлать .get_unchecked()
источник

EG

Emmanuel Goldstein in rust_offtopic
Фактически, это позволяет сделать статическую проверку, что «источником» объекта был конкретный объект
источник

H

Hirrolot in rust_offtopic
это прекрасно
источник

H

Hirrolot in rust_offtopic
но все ещё непонятно какой код писать с этим
источник

AN

Alex Noname in rust_offtopic
👍
источник

H

Hirrolot in rust_offtopic
я один раз написал HRTB потому что компилятор обычные лайфтаймы не съедал, он оно заработало, я правда до сих пор хз почему
источник

H

Hirrolot in rust_offtopic
прикольно
источник

EG

Emmanuel Goldstein in rust_offtopic
источник

EG

Emmanuel Goldstein in rust_offtopic
Может быть ещё для всяких графов полезно и прочей такой фигни
источник

TK

Traveller Kolsky in rust_offtopic
Не понимаю. Какие гарантии даёт drop для произвольного лайфтайма?
источник

H

Hirrolot in rust_offtopic
источник

EG

Emmanuel Goldstein in rust_offtopic
make_guard!(a);
make_guard!(b);

Теперь в переменных a и b типы с разными инвариантными лайфтаймами, причём b живёт дольше, чем a.
источник

EG

Emmanuel Goldstein in rust_offtopic
Твоя версия не работает
источник