TGViewer
Random Rust Dev Random Rust Dev @random_rust_dev · 472 subscribers
Post #437 833
Придумал забавный способ передать список из разных типов в функцию.

trait List {
type Head;
type Tail: List;

fn split(self) -> (Self::Head, Option<Self::Tail>);
}


При этом трейт должен быть конкретный, для задачи, что бы в Head добавить нужный баунд.

В чем тут прикол, ведь так список как бы бесконечный получается, раз Head всегда есть?
В том то и дело, что с точки зрения типов - да, бесконечный.
Только в конце списка Tail = Void, а у Void уже оба Head = Void и Tail = Void.
Сам Void это очевидно enum Void {}, который реализует любые нужный трейты.
То есть это бесконечный список типов, бесконечный хвост которого - пустота.
А List::split просто вернет None хвост в "рантайме".

Функция, в которую передали такой список может продолжать делать split, пока хвост - Some(tail).
Ограничение этой конструкции в том, что функция не может делать split в цикле, там же разные типы. Так что она либо делает это рекурсивно, либо фиксированное максимальное количество раз в теле.

Ссылка на playground с демонстрацией идеи
https://play.rust-lang.org/?version=stable&mode=debug&edition=2024&gist=82105fbaa8d370dec34f00a5900793df
play.rust-lang.org Rust Playground A browser interface to the Rust compiler to experiment with the language
More from @random_rust_dev
  1. Sep 20, 2026И всё же ИИ отличная штука. Никакой поисковик не мог мне дать ответ на вопрос, почему шурш…
  2. Sep 20, 2026Скелетор злодей, но не врун
  3. Sep 18, 2026Я попросил GPT Astra повысить производительность Alkahest. GPT смог прогнать профайлер и у…
  4. Sep 16, 2026PC gaming with extra steps
  5. Sep 14, 2026Сегодня снова загадка. Вот в этом коде будет ли соптимизирован bound check в последнем выр…
  6. Sep 13, 2026Чуть не забыл. Поздравлчю всех с днём промпт-инженера!
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →