Rust Lang Beginners (@rust_beginners_ru) — Telegram-чат | Telegram Dialogs
Все каналы
Rust Lang Beginners

Rust Lang Beginners

@rust_beginners_ru

4.2K участников технологии 💬 Комментарии открыты

Для новичковых вопросов по языку Rust (но лучше сначала попробовать их прогуглить). Используйте https://play.rust-lang.org для примеров кода. • @rustlang_ru - основной чат • @this_week_in_rust - новости • @rust_offtopic - для не-раст обсуждений

Последние публикации

Rust Lang Beginners
15.07.2026 15:28
Если все понятно в теории, но не понятно именно практика и применимость к расту, то можно так сократить описание: В расте вся вариантность только в лайфтаймах и по факту все сводится к тому можно ли привести один тип с лайфтаймом к другому типу с лайфтаймом. 1. covariant struct Foo<'lf> { field: &'lf str } В такой структуре можно сужать лайфтайм параметра (чтоб например два разных типа с одним лайфтаймом принимать в функции) fn compare<'lf> (one: Foo<'lf>, another: &'lf str) -> bool {..} Самый полезный вариант отношений. 2. invariant struct Bar<'lf> { field: Cell<&'lf u32> } В такой структуре нельзя менять (расширять или сужать) лайфтайм, он является "маркером" см. брендирование в GhostCell Логика простая: У тебя в структуре некоторые данные которые могут меняться, значит они должны сохранять лайфтайм оригинала, чтоб случайно не получилось "сузить" и заменить поле значением меньше. По этому все инвариантные лайфтаймы будут где-то где есть мутабельность T в Cell<T>/ UnsafeCell<T>/ &mut T 3. contrvariant в основном выражается через функции (там она и применима) struct Baz<'any>{ field: fn(&'any u32) } тут действует обратная логика, т.е. лайфтайм можно "расширить" (по факту ты выражаешь не лайфтайм, а дырку, по этому это описание не совсем точное), например до статика: let baz_static: Baz<'static> = baz; Логика такая: Если можно принимать любой лайфтайм, то можем принимать и 'static ps: в большинстве случаев при создании своих структур тебе ничего не надо делать, т.к. раст выведет отношение сам, но когда делаешь какойто врапер, коллекцию и не хранишь реальный T иногда важно проставить правильный PhatomData<..> чтоб поведение было таким как ты хочешь (чаще всего covariant) ну и примеры функций чекеров (то что они скомпилируются уже будет гарантировать что в типах правильное предположение о variance) возьмем два лайфтайма 'long:'short fn covariant<'short, 'long: 'short>( value: Foo<'long>, ) -> Foo<'short> { value } fn contravariant<'short, 'long: 'short>( value: Baz<'short>, ) -> Baz<'long> { value } для инвариантного Bar ниодна из них не скомпилируется https://play.rust-lang.org/?version=stable&mode=debug&edition=2024&gist=736049d0b7740534597e2c251762e1b3
Rust Lang Beginners
15.07.2026 14:27
https://t.me/dereference_pointer_there/7223
Rust Lang Beginners
15.07.2026 14:15
Буквально что угодно
Rust Lang Beginners
15.07.2026 14:15
Просто начни что-то делать с этим
Rust Lang Beginners
15.07.2026 13:52
Товарищи добрый день,такой вопрос: я никак не могу понять смысл механизма вариантности, я понимаю что означает ковариантность инвариантность и т.д. но никак не пойму как это пртменить на практике. Мб сможете посоветовать что-нибудь дельное?
Rust Lang Beginners
15.07.2026 06:46
не больше, чем лайфтайм головы :)
Rust Lang Beginners
15.07.2026 05:52
какой лайфтайм у кода в голове?
Rust Lang Beginners
15.07.2026 05:51
Это никуда не делось
Rust Lang Beginners
15.07.2026 04:43
А как же писать код на бумаге и компилировать его в голове
Rust Lang Beginners
15.07.2026 03:21
хотя даже лучше с раст анализатором ибо он тебе сократит кучу времени на первых порах
Чат поддержки
Ответим здесь же, обычно быстро
Здравствуйте! Напишите ваш вопрос — оператор ответит в этом чате.