3. Трейты. Программирование на Rust (весна 2019)
ฝัง
- เผยแพร่เมื่อ 1 มี.ค. 2019
- Третья лекция курса «Программирование на Rust» (весна 2019).
Преподаватель - Алексей Александрович Кладов.
Страница лекции на сайте CSC: tinyurl.com/csc-rust-3
Ссылка на материалы: github.com/matklad/rust-course
Все лекции курса: bit.ly/2QfWama
каждую лекцию все больше и больше чашка чая
Одни из лучших лекций по CS в ру сегменте
00:00:15 - Сопоставления с Образцом
00:04:09 - Range Patterns
00:05:32 - Binding Modes
00:08:22 - Сахар
00:09:10 - Всё -- Паттерны
00:10:00 - Параметричский Полиморфизм
00:12:00 - Параметризованные функции
00:13:08 - Traits
00:16:03 - impl MyTrait for YourType
00:17:36 - Return type polymorphism
00:19:24 - Static Dispatch
00:20:30 - Мономорфизация
00:22:56 - Дженерики в Java
00:25:55 - Мономорфизация
00:28:23 - Inlining
00:32:42 - Мономорфизация vs. Стирание Типа
00:38:17 - Трейты в Rust vs. Шаблоны в С++
00:38:40 - Проверка типов
00:40:32 - Swift Generics
00:41:02 - Fully Qualified Syntax
00:45:53 - Where clauses
00:46:41 - "Наследование" трейтов
00:48:46 - Полезные Трейты
00:49:03 - Default
00:52:21 - Clone
00:54:57 - Copy
00:56:48 - Derive
01:00:17 - PartialEq, Eq
01:05:34 - PartialOrd, Ord
01:12:01 - std::hash::Hash
01:18:10 - Drop
01:24:01 - std::mem Tricks
01:27:49 - Эмуляция Линейных Типов
01:30:52 - Порядок Drop
01:32:10 - dropck
01:34:48 - Deref
01:39:03 - DerefMut
01:39:13 - std::ops::Index / IndexMut
01:41:24 - Мораль
Спасибо, что повторили вопрос на камеру)
спасибо за лекции, вообще огонь!
Благодарю за лекцию, трейты мощная вещь
Из лекции я понял, что если я структура и у меня все поля имплементируют дефолт, то дефолт для структуры это просто структура, где все поля задефолчены, а если я енум, то дерайв дефолт просто не работает. :)
16.08.22. Дефолт для енумов уже работает
@@klimlitovski4057 Как? Первый вариант что ли выбирает? Почему?
@@vlad071096 нужно пометить атрибутом тот вариант который должен быть дефолтным
Касательно примера с App и Database - мне было непонятно почему мы не можем move out поле мутабельной структуры. Понятно стало только после того как прочитал на stack overflow, что компилятор раста отслеживает чтобы переменная не использовалась повторно только для локальных переменных, но не для полей структуры. Поэтому для поля структуры нужен дополнительный контейнер в роли которого выступает Option. Вот это было бы неплохо в лекции явно сказать.
Растовские трейты достаточно сильно напоминают CRTP из C++
1:25:28 namespace std расширять нельзя, но можно добавлять специализации шаблонов для своих типов.
13:20 Не знаю кто называет Trait типажами, но первое что приходит на ум, - характеристика, прекрасно описывает суть происходящего
В офф переводе книги the book так переводят
вот с++ и обзавелся классами хаскеля ;-)
Упоминалось про расширение namespace std в с++. Уточню, что расширять его нельзя новыми объектами в широком смысле этого слова, будь то классы или новые функции, но вот переопределять стандартные функции для пользовательских классов можно, что и делают для std::swap
Ты - не ты, когда ты NaN
nan - на казахском: хлеб)))
У меня T::foo(s) выдаёт имплементацию трейта
Сформировал для себя интуицию, что трейт это некая характеристика, или качество, или поведение. То есть это какой-то набор предикатов (функций), которые могут относится к разным объектам (типам). Из этой точки зрения как раз вытекает интуиция о том, что трейт не может быть типом.
С базой данных это не обман компилятора. Обычно в других языках self.db у вас пойнтер... но кто проверяет db != nullptr перед вызовом базы данных? И в какой момент жизни программного обеспечения там таки окажется nullptr? Вот чтобы этого никогда не случилось Rust и контролирует ситуацию.
Есть ли в rust функциональные конвейеры как в f# (x |> f) ?
нет
их скоро в js добавят
Почему кстати нельзя в примере с ДБ, реализовать shutdown на уровне дропа ДБ, как раз таки будет в духе RAII и клас работающий с дБ не должен будет переживать за это. Хотя я думаю это просто синтетический пример для понимания что такое может быть и как с этим бороться
Да, это синтетический пример, и, действительно, если всё ровно так, то лучше убрать Db::shutdown вообще. Более реалистичный пример был бы `fn shutdown(self) -> io::Result` -- если операция выключения может зафейлится (вернуть Result), то в дроп её не засунуть. Пример из стандартной библиотеки такой формы: JointHandle::join
Я вот ничего не понял про "патерн мачинг", точнее я понимаю, но когда начинается, то что на слайде 3 и 5, то всё. Я ничего не понял :) Почему _ у other освобождает что-то из памяти на слайде 3. Какой именно xs и откуда он берётся. В общем для таких как я надо всё по медленнее и курс "Раст для тех кто умел писать только скрипты на питоне" :)
Я всю жизнь писал на плюсах и тоже мало что понял про паттерны.
Это что-то из новомодного сахарного программирования, про которое деды и не слыхивали.
Это больше про функциональщину из времен эдак за двадцать лет до появления плюсов, можно посмотреть курс про Хаскель на этом же канале или что-то почитать про какой-нибудь OCaml. Круто что из 1970 года это проникает в наше время)
53:40 на изи написать:
```
trait Clone[T
interface Default {
_default(): T
}
class Cat implements Default {
_default() {
return new Cat()
}
}
разве это не аналог трейта Default. Это typescript
а сори, должен быть статичный метод
Да, в том и дело что этот метод должен быть статик. Не знаю языка где возможно делать статические методы в интерфейсах, поэтому сделать такой интерфейс проблематично
Лекции отличные но слишком быстро... успеваешь уловить только часть сказанного на уровне образов лишь к концу этого самого сказанного...
Думайте быстрее))
Дело не в думай быстрее а в том что слишком много связей и абстракций с другими ЯП. Слишком. Нужен большой багаж. Если его нету то шансов понять что то с каждой каждой новой минутой все меньше и меньше.
@@ski5556 ну не то что бы большой. C++ и немного Хаскеля
Вторая половина, ничего не понятно. Надо бы хоть примеры какие-то.
чота ДЗ так и нет. Я поплыл где-то на середине второй лекции, слишкмо много информации, ньюансов каких-то, слишком много "это будет в другой лекции". Я так и не понял, зачем трейты, если можно без них.
И без практики (ДЗ) это всё не заходит. Видимо нужно проходить rust by example
А что касается вопросов из зала, можно поставить конденсаторный микрофон с кардиойдной направленностью, направленынный в зал и за микшером человек, который бы увеличивал или уменьшал гейн микрофона, когда это нужно. Там бы звук из зала был сильно лучше и даже не нужно ходить по залу с микрофоном, главное чтоб тишина была в зале.
такой сетап например sE Electronics X1 S (10к) + любой микшер с фантомным питанием (2-3к). Для площадки на которой вы ведёте курсы я думаю это посильные деньги.
а можно сделать ещё богаче, поставить два микрофона, 1 в начале зала, другой в середине и в зависимости от того к какому микрофону ближе говорящий, рулить нужный ползунок гейна и громкости на микшере.
И повторять вопросы не нужно будет. Нужен просто человек который сидел бы в наушниках и не зевал, мониторил звук с микрофонов и рулил микшером.
Уже 2 ДЗ есть.
@@flashmozzg а где они опубликованы? Я ниодного нигде не вижу
@@atommixz На странице курса, но нужно быть на него записанным, чтобы их увидеть.
На самом деле можно без всего и писать на чистом Си. Трейты нужны как минимум для обобщений, для расширения любых типов и перегрузки операторов. Например, можно принимать дженерик аргумент, для которого реализован трейт AsRef от типа str и можно принимать String и &str. Без трейтов пришлось бы писать две версии или передавать что-то одно. Можно написать свой трейт и реализовать его для любого чужого типа и вызывать новые методы через точку. Также трейты могут быть "динамическими", то есть принимаем не тип с реализацией какого-то трейта статически, а трейт объект и в рантайме его уже ковыряем - об этом Алексей должен рассказать позже.
У препода плоховато с дикцией, когда ускоряется не разобрать, что он там бормочет
Потому что молодой, малоопытный.
А старых преподов по Rust не существует :)
@@Uni-Coder согласен, никого не хотел обидеть
слишком много в речи жаргонизмов
В IT это нормально. Кроме того на большинство из таких жаргонизмов или нет русского аналога или ты его точно так же не поймёшь
У чувака явно двойка по русскому языку была, сложно его недоанглийский слушать.
Может и так. В разработчики берут не за отличное красноречие.
Доброе пожаловать в IT
Уверен что на эти англицизмы есть русский аналог, а даже если есть - он тебе будет понятен?
@@lizzienovigot конечно, умение придумывать новые смыслы и слова отличает чувака, который умеет придумывать от чувака, который просто заимствует и копирует.
я бы сказал двойка и по английскому: "API" == апи, "tuple" == тупл и т.д. Не так важно, но слух режет