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

  Рет қаралды 12,244

Лекторий ФПМИ

Лекторий ФПМИ

Күн бұрын

Пікірлер: 52
@lectory_fpmi
@lectory_fpmi 2 жыл бұрын
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
@nanoqsh
@nanoqsh 2 жыл бұрын
Лектор забыл сказать (или сказал, но я этого не понял), что если нужно чтобы Result автоматически конвертировался в Result при использовании оператора ? то нужно реализовать трейт From для U
@nanoqsh
@nanoqsh 2 жыл бұрын
То есть можно сделать свой enum из ошибок и использовать его как общий тим всех ошибок для своего проекта. Для каждого типа ошибки реализовать From в свой тип. Или же реализовать std::error::Error для своей специфичной ошибки и возвращать в качестве ошибки Box, так как большинство типов ошибок реализуют этот трейт и подходят для каста в dyn Error. Более того, в std есть реализация From для Box если E это Error, так что это будет работать также и с оператором ?
@dmitriidemenev5258
@dmitriidemenev5258 2 жыл бұрын
1:12:09 можно обращаться к приватным полям структуры не в рамках .rs файла с исходным кодом, а в рамках модуля. Отдейльный файл это действительно отдельный модуль, но внутри файла можно использовать ключевое слово mod и создать модуль который не будет являться файлом.
@okolenmi7511
@okolenmi7511 2 жыл бұрын
Может некоторые зрители и жалуются на подачу, но я смотрю на итог - мне все понятно, а это неплохой результат.
@act0r399
@act0r399 2 жыл бұрын
Осторожно, в комментах боги Rust)
@dmitriidemenev5258
@dmitriidemenev5258 2 жыл бұрын
8:21 Clone это супертрейт Copy. То есть фраза "вектор имплементирует не Copy а Clone" по крайней мере может ввести ребят в заблуждение. Вместо этого следовало сказать, "вектор имплементирует Clone, но не его подтрейт (subtrait) Copy". По своей сути Copy может быть расценен как маркировочный трейт чьи implementers имеют битовые, также называемые неглубокие (shallow) операторы клонирования.
@alexloktionoff6833
@alexloktionoff6833 Жыл бұрын
Интересно есть ли механизм оптимизации копирования /*по сути MOVE*/ в RUST? Если я по факту только меняю phantom data или только один enum в структуре?
@АнтонАнтипин-п2ъ
@АнтонАнтипин-п2ъ Жыл бұрын
Пример где mut x 42, 43 теперь не компилится - и это очень хорошо, а то бы разочаровался в расте совсем. Теперь Borrowing ругается что move mut и x потом юзать нельзя.
@misterzurg7874
@misterzurg7874 Жыл бұрын
Тоже проверил, подтверждаю: rustc /tmp/d6D62rx6Xg/main.rs warning: value assigned to `x` is never read --> /tmp/d6D62rx6Xg/main.rs:8:5 | 8 | x = 43; | ^ | = help: maybe it is overwritten before being read? = note: `#[warn(unused_assignments)]` on by default error[E0506]: cannot assign to `x` because it is borrowed --> /tmp/d6D62rx6Xg/main.rs:8:5 | 7 | let y = &x; | -- borrow of `x` occurs here 8 | x = 43; | ^^^^^^ assignment to borrowed `x` occurs here 9 | assert_eq!(*y, 42); | ------------------ borrow later used here error: aborting due to previous error; 1 warning emitted For more information about this error, try `rustc --explain E0506`.
@igorglushatov1948
@igorglushatov1948 2 жыл бұрын
Во-первых, хочется отметить, что лекции отличные! Но есть вопрос по поводу того, можно ли найти где-то лабы к данному курсу? Хотелось бы попрактиковать базу
@okolenmi7511
@okolenmi7511 2 жыл бұрын
Можешь на codewars (сайт такой) практиковаться. Как по мне, это один из самых простых способов самому попробовать и посмотреть как делают другие. Только сайт на английском, что может вызывать трудности у кого-то.
@ambient_cocklushkin
@ambient_cocklushkin Жыл бұрын
ты читал описание к видео?
@alexandrdeveloper1242
@alexandrdeveloper1242 8 ай бұрын
Чем они отличные? Ничерта не ясно. Галопом по европам. Ну для примера: в начале показано как вызвать бубнеж боррроу чекера - более чем легко. А вот как этот же код переписать, не показано. Что касается самого языка, то я почувствовал себя человеком, испорченным objective C и как не странно Delphi. На мой взгляд там тема копирования, ссылок, указателей и памяти решена хоть и не полностью, но намного логичнее. Совершенно не ясно почему borrow checker не возвращает владение из функции. Это совершенно контр-интуитивно и контр-архитектурно. Это какой-то "переборроу" .
@mahabat23
@mahabat23 6 ай бұрын
@@alexandrdeveloper1242 вернуть владение можно, но только явно: fn takes_and_gives_back(s: String) -> String { println!("I own this string: {}", s); s // Return the ownership of the string }
@safocl9768
@safocl9768 Жыл бұрын
34:59 -- блин -- а вот енто уже уникально прикольно выглядит -- тоесть в расте возможно сделать инит константы внутри вложенного скоупа -- при ентом она будет видна за его пределами как на общих основаниях... В си и си++ такого сделать нельзя для обычных типов -- только создать свою обертку по сути типа с флагом isInitialized и set() и get() методами к примеру -- в set() если флаг возведен выбрасывать ошибку...
@safocl9768
@safocl9768 Жыл бұрын
2:09:38 -- непонятны выводы -- сравнение реализаций стандартной либы -- они могут же быть разные -- в стандарте плюсов есть только отдельные указания по необходимым соответствиям -- внутреннее строение реализации каждый компилятор делает свою.... По мне -- так енто непрофессионально -- сравнивать какие-то конкретные реализации. Сравнивание языков возможно только по факту сравнивая их стандарты -- тоесть определенные установленные гарантии и требования.
@dmitriidemenev5258
@dmitriidemenev5258 2 жыл бұрын
1:35:50 Если быть точнее оператор ? только сейчас работает для Option и Result. Сейчас также есть Nightly API (try_trait_v2 #84277) который предоставляет Try трейт позволяющий реализовать оператор ? для условно произвольных типов данных.
@alishergaliev7714
@alishergaliev7714 2 жыл бұрын
00:35:05 Пример работает и компилируется из-за сочетания двух вещей: затенения переменных и трейта Copy. То есть происходит следующее: 1. В начале инициализируется переменная x = 42 2. Потом ссылка на 42 (то есть на x) присваивается y, но из-за того что тип i32 имплементирует трейт Copy, по сути просто происходит сперва копирование значения, а потом присваивание ссылки на скопированное значение. 3. Исходная переменная x = 42 затеняется (уничтожается) и создается новая переменная x = 43. 4. Выводится значение у, которое как мы помним есть ссылка на скопированное значение. В общем пример жутко синтетический и работает попросту по причине того, что все значения Copy и еще в добавок константы и по сути прописаны в бинарнике (в частности значение переменной y) 😉
@yardez5990
@yardez5990 2 жыл бұрын
там не может затенения происходить слова let нет в 3 пункте
@jonnytomato7232
@jonnytomato7232 2 жыл бұрын
Пример не работает , так как там borrowing x происходит, и нет там никакого затенения, так как не создается новая переменная, и владение переменной х фактически принадлежит y, код из примера не скомпилиться.
@alexeiguirik9463
@alexeiguirik9463 Жыл бұрын
Атас, просто невыносимо слушать эти разговоры с невтыкающей студентотой - не лекция, а какая-то рыхлая болтовня. Препод что-то мямлит, студенты в голос спорят про что-то в фоне. Кто так лекции читает? И еще забавный момент - по любому поводу препод поднимает ручки и говорит: "Ой, ну я не эксперт по ". Так если ты не эксперт, чего тогда слайды такие нарисовал? Может, надо было поглубже проработать материал, чтобы быть в состоянии ответить на элементарные вопросы? С UTF-8 особенно смешно было.
@evgix
@evgix 2 жыл бұрын
Ужасна подача материала (не говоря, что перед заливкой можно было звук увеличить), почему-то лекция построена не как обучающий материал, а как доклад с элементами игры со зрителями. В итоге про владения толком и не было рассказано, аудитория плывет даже в паттерн матчинге. Подход лектора сводится к тому, что он "грузит" вопросами по теме, о которой только собирается рассказать (как будто он на докладе, и аудитория уже знает о расте, ставя в пример какие-то исключающие и запутывающие примеры, вместо обучающего материала).
@ЫГы-р2д
@ЫГы-р2д 2 жыл бұрын
Ты хотел, чтобы лектор целый час рассказывал про одну из фичей? И что плохого в том, чтобы контактировать с аудиторией? Лекции сделаны в первую очередь для студентов вуза, а не для нас.
@КириллКириллович
@КириллКириллович 2 жыл бұрын
@@ЫГы-р2д и эти студенты плывут. По речи, подаче лектора видно, что он воспринимает раст как Некрономикон или учебник санскрита, который нужно вызубрить и бездумно повторять, но не как инструмент. Видимо, сам он на расте код не пишет.
@СтраусТруп-с5н
@СтраусТруп-с5н 2 жыл бұрын
...
@niklkelbon3662
@niklkelbon3662 2 жыл бұрын
Боже ну и бред. Строка в С++ "не обладает никакими инвариантами и вообще ужасна" кек, естественно она обладает кучей инвариантов и не аллоцирует на 1 байт памяти как в расте... SSO видимо борроу чекер помешал сделать. И естественно в С++ есть также wstring и любая вообще строка т.к. std::basic_string Насчёт претензий к std::shared ptr вообще абсурд, он идеален. Единственную претензию которую я слышал, это что там по умолчанию аторманые счётчики, но если у тебя shared ptr в НЕмногопоточной программе - ты неправильно применяешь shared ptr. Это очевидно всем, кроме тех кто хочет сделать там не атомарные операции. Мне ни разу в жизни не нужны были shared ptr не в ситуации нескольких потоков. А в расте это тупо костыль на уровне языка, типа нельзя иметь несколько указателей на память, а вот shared ptr на те, обходите тупые ограничения языка рантайм оверхедом P.S. нейминг в расте типа Clone Copy или Rc / Result просто ужасен
@dmitriidemenev5258
@dmitriidemenev5258 2 жыл бұрын
Касательно SSO, в Rust помимо непосредственно String есть ещё &'static str. И если нужно работать как со строками, достаточно использовать &str так как есть метод String::as_str().
@dmitriidemenev5258
@dmitriidemenev5258 2 жыл бұрын
Если требуется NULL-terminated строка, есть core::ffi::CStr и core::ffi::CString.
@dmitriidemenev5258
@dmitriidemenev5258 2 жыл бұрын
Несколько неизменяемых ссылок на память иметь можно.
@dmitriidemenev5258
@dmitriidemenev5258 2 жыл бұрын
Нейминг мне нормальный, но это видимо уже вкусовщина.
@niklkelbon3662
@niklkelbon3662 2 жыл бұрын
@@dmitriidemenev5258 в С++ тоже есть string_view, const char* и что угодно ещё, что не мешает сделать SSO
@niklkelbon3662
@niklkelbon3662 2 жыл бұрын
Ладно, лектор видимо не в своём уме, ветвления и проверки каким то чудом не то что не замедляют, а УСКОРЯЮТ код у него и алгоритмы "гораздо быстрее чем в С++", что то на уровне война ради демилитаризации сказанул
@niklkelbon3662
@niklkelbon3662 2 жыл бұрын
@Андрей Костин если бы вы что то знали про С++, то знали бы что restrict это вообще С, а в С++ такого нет и вместо этого просто правила что с чем алиасится, которые знать программисту необязательно. noexcept и "рефки" тоже вполне можно не расставлять, лучше расскажите что раст делает в ситуации когда у него тоже вообще то есть исключения и они работают абсолютно также как в плюсах, но нет возможности указать noexcept. Паттерн матчинг как показывает практика практически нигде не нужен. Напишите код на расте который делает эту самую "диспетчеризацию" и подумайте что реально под ним происходит. Эффективно ли это. LLVM-like иерархия в расте просто невозможна, т.к. вся она стоит на наследовании, которого как бы в расте нет
@niklkelbon3662
@niklkelbon3662 2 жыл бұрын
@Андрей Костин P.S. modern С++ как раз преполагает возвращение и принимание по значению тем более для интов, что гарантирует что проблемы с алиасингом не будет
@niklkelbon3662
@niklkelbon3662 2 жыл бұрын
@Андрей Костин растовские паники это абсолютно те же самые исключения из плюсов также разматывающие стек
@niklkelbon3662
@niklkelbon3662 2 жыл бұрын
@Андрей Костин хех, то есть обработка ошибок другими способами не замедляет программу?)) Исключения как раз для того и созданы, чтобы ускорять программу и не проверять срабатывающий 1 раз на миллиард bad alloc каждый раз ветвлением. P.S. ну и да, конечно исключения это часть возможностей языка по созданию своих абстракций. Они помогают сохранять инварианты, не предоставлять глубоко спрятанной реализации напрямую юзеру и т.д.. Но про то что раст не позволяет создавать свои абстракции я уже писал
@niklkelbon3662
@niklkelbon3662 2 жыл бұрын
@Андрей Костин если я тут начну перечислять все возможности С++ по созданию переиспользуемого кода думаю не хватит места на сервере гугла где записывается этот комментарий. Исключения безусловно быстрее обработки ошибок через if и ветвление. И если вы оперируете неким "идиоматичным раст" то идиоматичный С++ использует исключения для редких ошибок и получает преимуещство. И в нём НЕ ПОВЕРИТЕ тоже есть аналоги "енам типов" Result (expected / куча разных либ для этого / variant и т.д.)
Программирование на Rust 3. Traits
2:52:07
Лекторий ФПМИ
Рет қаралды 7 М.
Cheerleader Transformation That Left Everyone Speechless! #shorts
00:27
Fabiosa Best Lifehacks
Рет қаралды 16 МЛН
黑天使只对C罗有感觉#short #angel #clown
00:39
Super Beauty team
Рет қаралды 36 МЛН
Rust без Наследования
15:29
Bitωise
Рет қаралды 7 М.
5 причин изучать Rust в 2023
9:02
loftblog
Рет қаралды 41 М.
Зачем системным программистам Rust? Сергей Фомин, Яндекс
44:37
Видео с мероприятий {speach!
Рет қаралды 9 М.
4. Модули. Программирование на Rust (весна 2019)
1:38:01
Cheerleader Transformation That Left Everyone Speechless! #shorts
00:27
Fabiosa Best Lifehacks
Рет қаралды 16 МЛН