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
@nanoqsh2 жыл бұрын
Лектор забыл сказать (или сказал, но я этого не понял), что если нужно чтобы Result автоматически конвертировался в Result при использовании оператора ? то нужно реализовать трейт From для U
@nanoqsh2 жыл бұрын
То есть можно сделать свой enum из ошибок и использовать его как общий тим всех ошибок для своего проекта. Для каждого типа ошибки реализовать From в свой тип. Или же реализовать std::error::Error для своей специфичной ошибки и возвращать в качестве ошибки Box, так как большинство типов ошибок реализуют этот трейт и подходят для каста в dyn Error. Более того, в std есть реализация From для Box если E это Error, так что это будет работать также и с оператором ?
@dmitriidemenev52582 жыл бұрын
1:12:09 можно обращаться к приватным полям структуры не в рамках .rs файла с исходным кодом, а в рамках модуля. Отдейльный файл это действительно отдельный модуль, но внутри файла можно использовать ключевое слово mod и создать модуль который не будет являться файлом.
@okolenmi75112 жыл бұрын
Может некоторые зрители и жалуются на подачу, но я смотрю на итог - мне все понятно, а это неплохой результат.
@act0r3992 жыл бұрын
Осторожно, в комментах боги Rust)
@dmitriidemenev52582 жыл бұрын
8:21 Clone это супертрейт Copy. То есть фраза "вектор имплементирует не Copy а Clone" по крайней мере может ввести ребят в заблуждение. Вместо этого следовало сказать, "вектор имплементирует Clone, но не его подтрейт (subtrait) Copy". По своей сути Copy может быть расценен как маркировочный трейт чьи implementers имеют битовые, также называемые неглубокие (shallow) операторы клонирования.
@alexloktionoff6833 Жыл бұрын
Интересно есть ли механизм оптимизации копирования /*по сути MOVE*/ в RUST? Если я по факту только меняю phantom data или только один enum в структуре?
@АнтонАнтипин-п2ъ Жыл бұрын
Пример где mut x 42, 43 теперь не компилится - и это очень хорошо, а то бы разочаровался в расте совсем. Теперь Borrowing ругается что move mut и x потом юзать нельзя.
@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`.
@igorglushatov19482 жыл бұрын
Во-первых, хочется отметить, что лекции отличные! Но есть вопрос по поводу того, можно ли найти где-то лабы к данному курсу? Хотелось бы попрактиковать базу
@okolenmi75112 жыл бұрын
Можешь на codewars (сайт такой) практиковаться. Как по мне, это один из самых простых способов самому попробовать и посмотреть как делают другие. Только сайт на английском, что может вызывать трудности у кого-то.
@ambient_cocklushkin Жыл бұрын
ты читал описание к видео?
@alexandrdeveloper12428 ай бұрын
Чем они отличные? Ничерта не ясно. Галопом по европам. Ну для примера: в начале показано как вызвать бубнеж боррроу чекера - более чем легко. А вот как этот же код переписать, не показано. Что касается самого языка, то я почувствовал себя человеком, испорченным objective C и как не странно Delphi. На мой взгляд там тема копирования, ссылок, указателей и памяти решена хоть и не полностью, но намного логичнее. Совершенно не ясно почему borrow checker не возвращает владение из функции. Это совершенно контр-интуитивно и контр-архитектурно. Это какой-то "переборроу" .
@mahabat236 ай бұрын
@@alexandrdeveloper1242 вернуть владение можно, но только явно: fn takes_and_gives_back(s: String) -> String { println!("I own this string: {}", s); s // Return the ownership of the string }
@safocl9768 Жыл бұрын
34:59 -- блин -- а вот енто уже уникально прикольно выглядит -- тоесть в расте возможно сделать инит константы внутри вложенного скоупа -- при ентом она будет видна за его пределами как на общих основаниях... В си и си++ такого сделать нельзя для обычных типов -- только создать свою обертку по сути типа с флагом isInitialized и set() и get() методами к примеру -- в set() если флаг возведен выбрасывать ошибку...
@safocl9768 Жыл бұрын
2:09:38 -- непонятны выводы -- сравнение реализаций стандартной либы -- они могут же быть разные -- в стандарте плюсов есть только отдельные указания по необходимым соответствиям -- внутреннее строение реализации каждый компилятор делает свою.... По мне -- так енто непрофессионально -- сравнивать какие-то конкретные реализации. Сравнивание языков возможно только по факту сравнивая их стандарты -- тоесть определенные установленные гарантии и требования.
@dmitriidemenev52582 жыл бұрын
1:35:50 Если быть точнее оператор ? только сейчас работает для Option и Result. Сейчас также есть Nightly API (try_trait_v2 #84277) который предоставляет Try трейт позволяющий реализовать оператор ? для условно произвольных типов данных.
@alishergaliev77142 жыл бұрын
00:35:05 Пример работает и компилируется из-за сочетания двух вещей: затенения переменных и трейта Copy. То есть происходит следующее: 1. В начале инициализируется переменная x = 42 2. Потом ссылка на 42 (то есть на x) присваивается y, но из-за того что тип i32 имплементирует трейт Copy, по сути просто происходит сперва копирование значения, а потом присваивание ссылки на скопированное значение. 3. Исходная переменная x = 42 затеняется (уничтожается) и создается новая переменная x = 43. 4. Выводится значение у, которое как мы помним есть ссылка на скопированное значение. В общем пример жутко синтетический и работает попросту по причине того, что все значения Copy и еще в добавок константы и по сути прописаны в бинарнике (в частности значение переменной y) 😉
@yardez59902 жыл бұрын
там не может затенения происходить слова let нет в 3 пункте
@jonnytomato72322 жыл бұрын
Пример не работает , так как там borrowing x происходит, и нет там никакого затенения, так как не создается новая переменная, и владение переменной х фактически принадлежит y, код из примера не скомпилиться.
@alexeiguirik9463 Жыл бұрын
Атас, просто невыносимо слушать эти разговоры с невтыкающей студентотой - не лекция, а какая-то рыхлая болтовня. Препод что-то мямлит, студенты в голос спорят про что-то в фоне. Кто так лекции читает? И еще забавный момент - по любому поводу препод поднимает ручки и говорит: "Ой, ну я не эксперт по ". Так если ты не эксперт, чего тогда слайды такие нарисовал? Может, надо было поглубже проработать материал, чтобы быть в состоянии ответить на элементарные вопросы? С UTF-8 особенно смешно было.
@evgix2 жыл бұрын
Ужасна подача материала (не говоря, что перед заливкой можно было звук увеличить), почему-то лекция построена не как обучающий материал, а как доклад с элементами игры со зрителями. В итоге про владения толком и не было рассказано, аудитория плывет даже в паттерн матчинге. Подход лектора сводится к тому, что он "грузит" вопросами по теме, о которой только собирается рассказать (как будто он на докладе, и аудитория уже знает о расте, ставя в пример какие-то исключающие и запутывающие примеры, вместо обучающего материала).
@ЫГы-р2д2 жыл бұрын
Ты хотел, чтобы лектор целый час рассказывал про одну из фичей? И что плохого в том, чтобы контактировать с аудиторией? Лекции сделаны в первую очередь для студентов вуза, а не для нас.
@КириллКириллович2 жыл бұрын
@@ЫГы-р2д и эти студенты плывут. По речи, подаче лектора видно, что он воспринимает раст как Некрономикон или учебник санскрита, который нужно вызубрить и бездумно повторять, но не как инструмент. Видимо, сам он на расте код не пишет.
@СтраусТруп-с5н2 жыл бұрын
...
@niklkelbon36622 жыл бұрын
Боже ну и бред. Строка в С++ "не обладает никакими инвариантами и вообще ужасна" кек, естественно она обладает кучей инвариантов и не аллоцирует на 1 байт памяти как в расте... SSO видимо борроу чекер помешал сделать. И естественно в С++ есть также wstring и любая вообще строка т.к. std::basic_string Насчёт претензий к std::shared ptr вообще абсурд, он идеален. Единственную претензию которую я слышал, это что там по умолчанию аторманые счётчики, но если у тебя shared ptr в НЕмногопоточной программе - ты неправильно применяешь shared ptr. Это очевидно всем, кроме тех кто хочет сделать там не атомарные операции. Мне ни разу в жизни не нужны были shared ptr не в ситуации нескольких потоков. А в расте это тупо костыль на уровне языка, типа нельзя иметь несколько указателей на память, а вот shared ptr на те, обходите тупые ограничения языка рантайм оверхедом P.S. нейминг в расте типа Clone Copy или Rc / Result просто ужасен
@dmitriidemenev52582 жыл бұрын
Касательно SSO, в Rust помимо непосредственно String есть ещё &'static str. И если нужно работать как со строками, достаточно использовать &str так как есть метод String::as_str().
@dmitriidemenev52582 жыл бұрын
Если требуется NULL-terminated строка, есть core::ffi::CStr и core::ffi::CString.
@dmitriidemenev52582 жыл бұрын
Несколько неизменяемых ссылок на память иметь можно.
@dmitriidemenev52582 жыл бұрын
Нейминг мне нормальный, но это видимо уже вкусовщина.
@niklkelbon36622 жыл бұрын
@@dmitriidemenev5258 в С++ тоже есть string_view, const char* и что угодно ещё, что не мешает сделать SSO
@niklkelbon36622 жыл бұрын
Ладно, лектор видимо не в своём уме, ветвления и проверки каким то чудом не то что не замедляют, а УСКОРЯЮТ код у него и алгоритмы "гораздо быстрее чем в С++", что то на уровне война ради демилитаризации сказанул
@niklkelbon36622 жыл бұрын
@Андрей Костин если бы вы что то знали про С++, то знали бы что restrict это вообще С, а в С++ такого нет и вместо этого просто правила что с чем алиасится, которые знать программисту необязательно. noexcept и "рефки" тоже вполне можно не расставлять, лучше расскажите что раст делает в ситуации когда у него тоже вообще то есть исключения и они работают абсолютно также как в плюсах, но нет возможности указать noexcept. Паттерн матчинг как показывает практика практически нигде не нужен. Напишите код на расте который делает эту самую "диспетчеризацию" и подумайте что реально под ним происходит. Эффективно ли это. LLVM-like иерархия в расте просто невозможна, т.к. вся она стоит на наследовании, которого как бы в расте нет
@niklkelbon36622 жыл бұрын
@Андрей Костин P.S. modern С++ как раз преполагает возвращение и принимание по значению тем более для интов, что гарантирует что проблемы с алиасингом не будет
@niklkelbon36622 жыл бұрын
@Андрей Костин растовские паники это абсолютно те же самые исключения из плюсов также разматывающие стек
@niklkelbon36622 жыл бұрын
@Андрей Костин хех, то есть обработка ошибок другими способами не замедляет программу?)) Исключения как раз для того и созданы, чтобы ускорять программу и не проверять срабатывающий 1 раз на миллиард bad alloc каждый раз ветвлением. P.S. ну и да, конечно исключения это часть возможностей языка по созданию своих абстракций. Они помогают сохранять инварианты, не предоставлять глубоко спрятанной реализации напрямую юзеру и т.д.. Но про то что раст не позволяет создавать свои абстракции я уже писал
@niklkelbon36622 жыл бұрын
@Андрей Костин если я тут начну перечислять все возможности С++ по созданию переиспользуемого кода думаю не хватит места на сервере гугла где записывается этот комментарий. Исключения безусловно быстрее обработки ошибок через if и ветвление. И если вы оперируете неким "идиоматичным раст" то идиоматичный С++ использует исключения для редких ошибок и получает преимуещство. И в нём НЕ ПОВЕРИТЕ тоже есть аналоги "енам типов" Result (expected / куча разных либ для этого / variant и т.д.)