1/7. Целая прорва связных списков, чтобы выучить Rust: Плохой односвязный стек
markshevchenko 7 минут назад 1/7. Целая прорва связных списков, чтобы выучить Rust: Плохой односвязный стек Сложный 21 мин 248 Rust * Туториал Перевод Автор оригинала: Aria Desires Плохой односвязный списокЭта глава...
Anthropic — What company has the best second artificial intelligence model at the end of June?
В сфере искусственного интеллекта произошло заметное событие. markshevchenko 7 минут назад 1/7. Целая прорва связных списков, чтобы выучить Rust: Плохой односвязный стек Сложный 21 мин 248 Rust * Туториал Перевод Автор оригинала: Aria Desires Плохой односвязный списокЭта глава будет гораздо длиннее прочих, поскольку нам предстоит познакомиться практически со всем языком Rust и, чтобы лучше разобраться, часть материала мы будем осваивать «сложным путём». Наш первый список мы поместим в файл src/first.
Надо сказать компилятору Rust, что first. rs входит в состав нашей библиотеки. Для этого в начале файла src/lib.
Технические детали
rus (который создала для нас утилита Cargo) достаточно написать :// в lib. rs pub mod first; Базовое представление данныхЛадно, что такое связный список? Ну, в целом, это набор кусочков данных в куче, которые последовательно указывают друг на друга.
(Да, я знаю, что разработчикам ядра куча недоступна, мы сейчас не об этом! ) Связные списки — это то, что процедурные программисты не станут трогать 10-метровой палкой, а функциональные программисты используют вообще для всего. Кажется справедливым, что определение связного списка в этом случае что мы должны спросить у функциональных программистов.
И они дадут вам что-то такое:List a = Empty | Elem a (List a) Что приблизительно читается как «Список является либо Пустым, либо Элементом за которым следует Список». Это рекурсивное определение, выраженное через тип-сумму или, если подробнее, через тип, который «может принимать одно из нескольких значений, у каждого из которых может быть свой тип». В языке Rust типы-суммы называются перечислениями (enum)!
Отраслевые последствия
Если вы пришли из C-подобного языка, то речь идёт о знакомых и любимых нами enum, но на максималках. Ладно, давайте перепишем это функциональное определение на Rust! Для простоты первое время мы не будем использовать обобщения (generics).
Значениями узлов у нас будут обычные 32-битные числа. rs // pub говорит, что мы хотим, чтобы авторы других модулей могли использовать List pub enum Уф, как сложно. Попробуем скомпилировать:> cargo build error: recursive type `first::List` has infinite size --> src/first.
rs:4:1 | 4 | pub enum List { | ^^^^^^^^^^^^^ recursive type has infinite size 5 | Empty, 6 | Elem(i32, List), | ---- recursive without indirection | = help: insert indirection (e. , a `Box`, `Rc`, or `&`) at some point to make `first::List` representable Текст ошибки: рекурсивный тип first::List имеет бесконечный размер. Не знаю, как вы, а я определённо чувствую себя преданной всем сообществом функциональных программистов.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





