Программирование на Rust 2. Borrow checker. Standard library

preview_player
Показать описание

Дата лекции: 22.02.2022
Лектор: Александр Становой

00:00:00 Начало
00:01:38 Borrow Checker
00:15:13 Правила владения
00:25:50 drop
00:32:15 Drop flags
00:35:05 Примеры
00:43:50 Стандартная библиотека Rust
00:44:41 Option
01:16:49 Пример Borrowing
01:18:13 Result
01:23:39 Operator ?
01:29:55 transpose
01:36:49 Контейнеры
01:41:35 Vec
01:50:01 VecDeque
02:00:47 BTreeMap, BTreeSet
02:06:04 HashMap, HashSet
02:10:15 BinaryHeap
02:11:13 LinkedList
02:12:57 String
02:23:34 &str
02:32:05 Box
02:34:52 Rc
02:39:08 Weak
02:43:52 Arc

Съёмка: Данила Манаков
Монтаж: Александр Пронякин
Рекомендации по теме
Комментарии
Автор

00:00:00 Начало
00:01:38 Borrow Checker
00:15:13 Правила владения
00:25:50 drop
00:32:15 Drop flags
00:35:05 Примеры
00:43:50 Стандартная библиотека Rust
00:44:41 Option
01:16:49 Пример Borrowing
01:18:13 Result
01:23:39 Operator ?
01:29:55 transpose
01:36:49 Контейнеры
01:41:35 Vec
01:50:01 VecDeque
02:00:47 BTreeMap, BTreeSet
02:06:04 HashMap, HashSet
02:10:15 BinaryHeap
02:11:13 LinkedList
02:12:57 String
02:23:34 &str
02:32:05 Box
02:34:52 Rc
02:39:08 Weak
02:43:52 Arc

lectory_fpmi
Автор

1:12:09 можно обращаться к приватным полям структуры не в рамках .rs файла с исходным кодом, а в рамках модуля. Отдейльный файл это действительно отдельный модуль, но внутри файла можно использовать ключевое слово mod и создать модуль который не будет являться файлом.

dmitriidemenev
Автор

8:21 Clone это супертрейт Copy. То есть фраза "вектор имплементирует не Copy а Clone" по крайней мере может ввести ребят в заблуждение. Вместо этого следовало сказать, "вектор имплементирует Clone, но не его подтрейт (subtrait) Copy". По своей сути Copy может быть расценен как маркировочный трейт чьи implementers имеют битовые, также называемые неглубокие (shallow) операторы клонирования.

dmitriidemenev
Автор

Лектор забыл сказать (или сказал, но я этого не понял), что если нужно чтобы Result<T, E> автоматически конвертировался в Result<T, U> при использовании оператора ? то нужно реализовать трейт From<E> для U

nanoqsh
Автор

Пример где mut x 42, 43 теперь не компилится - и это очень хорошо, а то бы разочаровался в расте совсем. Теперь Borrowing ругается что move mut и x потом юзать нельзя.

АнтонАнтипин-пъ
Автор

Может некоторые зрители и жалуются на подачу, но я смотрю на итог - мне все понятно, а это неплохой результат.

okolenmi
Автор

00:35:05
Пример работает и компилируется из-за сочетания двух вещей: затенения переменных и трейта Copy.

То есть происходит следующее:

1. В начале инициализируется переменная x = 42

2. Потом ссылка на 42 (то есть на x) присваивается y, но из-за того что тип i32 имплементирует трейт Copy, по сути просто происходит сперва копирование значения, а потом присваивание ссылки на скопированное значение.

3. Исходная переменная x = 42 затеняется (уничтожается) и создается новая переменная x = 43.

4. Выводится значение у, которое как мы помним есть ссылка на скопированное значение.

В общем пример жутко синтетический и работает попросту по причине того, что все значения Copy и еще в добавок константы и по сути прописаны в бинарнике (в частности значение переменной y) 😉

alishergaliev
Автор

34:59 -- блин -- а вот енто уже уникально прикольно выглядит -- тоесть в расте возможно сделать инит константы внутри вложенного скоупа -- при ентом она будет видна за его пределами как на общих основаниях... В си и си++ такого сделать нельзя для обычных типов -- только создать свою обертку по сути типа с флагом isInitialized и set() и get() методами к примеру -- в set() если флаг возведен выбрасывать ошибку...

safocl
Автор

Интересно есть ли механизм оптимизации копирования /*по сути MOVE*/ в RUST? Если я по факту только меняю phantom data или только один enum в структуре?

alexloktionoff
Автор

Во-первых, хочется отметить, что лекции отличные! Но есть вопрос по поводу того, можно ли найти где-то лабы к данному курсу? Хотелось бы попрактиковать базу

igorglushatov
Автор

1:35:50 Если быть точнее оператор ? только сейчас работает для Option и Result. Сейчас также есть Nightly API (try_trait_v2 #84277) который предоставляет Try трейт позволяющий реализовать оператор ? для условно произвольных типов данных.

dmitriidemenev
Автор

2:09:38 -- непонятны выводы -- сравнение реализаций стандартной либы -- они могут же быть разные -- в стандарте плюсов есть только отдельные указания по необходимым соответствиям -- внутреннее строение реализации каждый компилятор делает свою....
По мне -- так енто непрофессионально -- сравнивать какие-то конкретные реализации. Сравнивание языков возможно только по факту сравнивая их стандарты -- тоесть определенные установленные гарантии и требования.

safocl
Автор

Атас, просто невыносимо слушать эти разговоры с невтыкающей студентотой - не лекция, а какая-то рыхлая болтовня. Препод что-то мямлит, студенты в голос спорят про что-то в фоне. Кто так лекции читает?
И еще забавный момент - по любому поводу препод поднимает ручки и говорит: "Ой, ну я не эксперт по <подставить нужное>". Так если ты не эксперт, чего тогда слайды такие нарисовал? Может, надо было поглубже проработать материал, чтобы быть в состоянии ответить на элементарные вопросы? С UTF-8 особенно смешно было.

alexeiguirik
Автор

Ужасна подача материала (не говоря, что перед заливкой можно было звук увеличить), почему-то лекция построена не как обучающий материал, а как доклад с элементами игры со зрителями. В итоге про владения толком и не было рассказано, аудитория плывет даже в паттерн матчинге. Подход лектора сводится к тому, что он "грузит" вопросами по теме, о которой только собирается рассказать (как будто он на докладе, и аудитория уже знает о расте, ставя в пример какие-то исключающие и запутывающие примеры, вместо обучающего материала).

evgix
Автор

Боже ну и бред. Строка в С++ "не обладает никакими инвариантами и вообще ужасна" кек, естественно она обладает кучей инвариантов и не аллоцирует на 1 байт памяти как в расте... SSO видимо борроу чекер помешал сделать. И естественно в С++ есть также wstring и любая вообще строка т.к. std::basic_string<Char, Traits, Allocator>
Насчёт претензий к std::shared ptr вообще абсурд, он идеален. Единственную претензию которую я слышал, это что там по умолчанию аторманые счётчики, но если у тебя shared ptr в НЕмногопоточной программе - ты неправильно применяешь shared ptr. Это очевидно всем, кроме тех кто хочет сделать там не атомарные операции.
Мне ни разу в жизни не нужны были shared ptr не в ситуации нескольких потоков.
А в расте это тупо костыль на уровне языка, типа нельзя иметь несколько указателей на память, а вот shared ptr на те, обходите тупые ограничения языка рантайм оверхедом
P.S. нейминг в расте типа Clone Copy или Rc / Result просто ужасен

niklkelbon
Автор

Ладно, лектор видимо не в своём уме, ветвления и проверки каким то чудом не то что не замедляют, а УСКОРЯЮТ код у него и алгоритмы "гораздо быстрее чем в С++", что то на уровне война ради демилитаризации сказанул

niklkelbon