3. Трейты. Программирование на Rust (весна 2019)

แชร์
ฝัง
  • เผยแพร่เมื่อ 1 มี.ค. 2019
  • Третья лекция курса «Программирование на Rust» (весна 2019).
    Преподаватель - Алексей Александрович Кладов.
    Страница лекции на сайте CSC: tinyurl.com/csc-rust-3
    Ссылка на материалы: github.com/matklad/rust-course
    Все лекции курса: bit.ly/2QfWama

ความคิดเห็น • 57

  • @ASERIA777
    @ASERIA777 2 ปีที่แล้ว +28

    каждую лекцию все больше и больше чашка чая

  • @Delimor
    @Delimor 3 ปีที่แล้ว +28

    Одни из лучших лекций по CS в ру сегменте

  • @qewolf
    @qewolf 4 ปีที่แล้ว +45

    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 - Мораль

  • @illiadenysenko7776
    @illiadenysenko7776 4 ปีที่แล้ว +21

    Спасибо, что повторили вопрос на камеру)

  • @slvrization
    @slvrization 4 ปีที่แล้ว +16

    спасибо за лекции, вообще огонь!

  • @alexkazimir3835
    @alexkazimir3835 3 ปีที่แล้ว +2

    Благодарю за лекцию, трейты мощная вещь

  • @iyanello
    @iyanello 4 ปีที่แล้ว +11

    Из лекции я понял, что если я структура и у меня все поля имплементируют дефолт, то дефолт для структуры это просто структура, где все поля задефолчены, а если я енум, то дерайв дефолт просто не работает. :)

    • @klimlitovski4057
      @klimlitovski4057 ปีที่แล้ว +4

      16.08.22. Дефолт для енумов уже работает

    • @vlad071096
      @vlad071096 ปีที่แล้ว

      @@klimlitovski4057 Как? Первый вариант что ли выбирает? Почему?

    • @klimlitovski4057
      @klimlitovski4057 ปีที่แล้ว +3

      @@vlad071096 нужно пометить атрибутом тот вариант который должен быть дефолтным

  • @michaelbuzuverov67
    @michaelbuzuverov67 2 หลายเดือนก่อน

    Касательно примера с App и Database - мне было непонятно почему мы не можем move out поле мутабельной структуры. Понятно стало только после того как прочитал на stack overflow, что компилятор раста отслеживает чтобы переменная не использовалась повторно только для локальных переменных, но не для полей структуры. Поэтому для поля структуры нужен дополнительный контейнер в роли которого выступает Option. Вот это было бы неплохо в лекции явно сказать.

  • @user-wq1zw4si8u
    @user-wq1zw4si8u 5 หลายเดือนก่อน +1

    Растовские трейты достаточно сильно напоминают CRTP из C++

  • @vlad071096
    @vlad071096 ปีที่แล้ว

    1:25:28 namespace std расширять нельзя, но можно добавлять специализации шаблонов для своих типов.

  • @cblbopotka3915
    @cblbopotka3915 2 ปีที่แล้ว +1

    13:20 Не знаю кто называет Trait типажами, но первое что приходит на ум, - характеристика, прекрасно описывает суть происходящего

    • @voodooman08
      @voodooman08 2 ปีที่แล้ว

      В офф переводе книги the book так переводят

  • @euginekosenko2268
    @euginekosenko2268 2 ปีที่แล้ว +2

    вот с++ и обзавелся классами хаскеля ;-)

  • @nefedov-dima
    @nefedov-dima 4 ปีที่แล้ว +1

    Упоминалось про расширение namespace std в с++. Уточню, что расширять его нельзя новыми объектами в широком смысле этого слова, будь то классы или новые функции, но вот переопределять стандартные функции для пользовательских классов можно, что и делают для std::swap

  • @heavis3103
    @heavis3103 3 ปีที่แล้ว +10

    Ты - не ты, когда ты NaN

    • @_e_mask
      @_e_mask 2 ปีที่แล้ว

      nan - на казахском: хлеб)))

  • @timoraivonen1848
    @timoraivonen1848 3 ปีที่แล้ว +1

    У меня T::foo(s) выдаёт имплементацию трейта

  • @adamsm1th27
    @adamsm1th27 6 หลายเดือนก่อน

    Сформировал для себя интуицию, что трейт это некая характеристика, или качество, или поведение. То есть это какой-то набор предикатов (функций), которые могут относится к разным объектам (типам). Из этой точки зрения как раз вытекает интуиция о том, что трейт не может быть типом.

  • @alexanderkalashnikov2721
    @alexanderkalashnikov2721 2 ปีที่แล้ว +1

    С базой данных это не обман компилятора. Обычно в других языках self.db у вас пойнтер... но кто проверяет db != nullptr перед вызовом базы данных? И в какой момент жизни программного обеспечения там таки окажется nullptr? Вот чтобы этого никогда не случилось Rust и контролирует ситуацию.

  • @user-ci8mb5qc5d
    @user-ci8mb5qc5d 5 ปีที่แล้ว +3

    Есть ли в rust функциональные конвейеры как в f# (x |> f) ?

  • @akorchyn
    @akorchyn 2 ปีที่แล้ว

    Почему кстати нельзя в примере с ДБ, реализовать shutdown на уровне дропа ДБ, как раз таки будет в духе RAII и клас работающий с дБ не должен будет переживать за это. Хотя я думаю это просто синтетический пример для понимания что такое может быть и как с этим бороться

    • @alekseykladov1144
      @alekseykladov1144 2 ปีที่แล้ว +3

      Да, это синтетический пример, и, действительно, если всё ровно так, то лучше убрать Db::shutdown вообще. Более реалистичный пример был бы `fn shutdown(self) -> io::Result` -- если операция выключения может зафейлится (вернуть Result), то в дроп её не засунуть. Пример из стандартной библиотеки такой формы: JointHandle::join

  • @IvanTheThird
    @IvanTheThird 3 ปีที่แล้ว +1

    Я вот ничего не понял про "патерн мачинг", точнее я понимаю, но когда начинается, то что на слайде 3 и 5, то всё. Я ничего не понял :) Почему _ у other освобождает что-то из памяти на слайде 3. Какой именно xs и откуда он берётся. В общем для таких как я надо всё по медленнее и курс "Раст для тех кто умел писать только скрипты на питоне" :)

    • @ddrdmakar4175
      @ddrdmakar4175 3 ปีที่แล้ว +1

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

    • @illiadenysenko7776
      @illiadenysenko7776 3 ปีที่แล้ว +4

      Это больше про функциональщину из времен эдак за двадцать лет до появления плюсов, можно посмотреть курс про Хаскель на этом же канале или что-то почитать про какой-нибудь OCaml. Круто что из 1970 года это проникает в наше время)

  • @VaGroz
    @VaGroz ปีที่แล้ว

    53:40 на изи написать:
    ```
    trait Clone[T

  • @danila_osin
    @danila_osin 2 ปีที่แล้ว

    interface Default {
    _default(): T
    }
    class Cat implements Default {
    _default() {
    return new Cat()
    }
    }
    разве это не аналог трейта Default. Это typescript

    • @danila_osin
      @danila_osin 2 ปีที่แล้ว

      а сори, должен быть статичный метод

    • @nanoqsh
      @nanoqsh ปีที่แล้ว

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

  • @ski5556
    @ski5556 2 ปีที่แล้ว

    Лекции отличные но слишком быстро... успеваешь уловить только часть сказанного на уровне образов лишь к концу этого самого сказанного...

    • @luden6794
      @luden6794 2 ปีที่แล้ว

      Думайте быстрее))

    • @ski5556
      @ski5556 2 ปีที่แล้ว +1

      Дело не в думай быстрее а в том что слишком много связей и абстракций с другими ЯП. Слишком. Нужен большой багаж. Если его нету то шансов понять что то с каждой каждой новой минутой все меньше и меньше.

    • @nanoqsh
      @nanoqsh 2 ปีที่แล้ว +1

      @@ski5556 ну не то что бы большой. C++ и немного Хаскеля

  • @user-sd7rd2fs7m
    @user-sd7rd2fs7m 3 ปีที่แล้ว +2

    Вторая половина, ничего не понятно. Надо бы хоть примеры какие-то.

  • @atommixz
    @atommixz 5 ปีที่แล้ว +13

    чота ДЗ так и нет. Я поплыл где-то на середине второй лекции, слишкмо много информации, ньюансов каких-то, слишком много "это будет в другой лекции". Я так и не понял, зачем трейты, если можно без них.
    И без практики (ДЗ) это всё не заходит. Видимо нужно проходить rust by example
    А что касается вопросов из зала, можно поставить конденсаторный микрофон с кардиойдной направленностью, направленынный в зал и за микшером человек, который бы увеличивал или уменьшал гейн микрофона, когда это нужно. Там бы звук из зала был сильно лучше и даже не нужно ходить по залу с микрофоном, главное чтоб тишина была в зале.
    такой сетап например sE Electronics X1 S (10к) + любой микшер с фантомным питанием (2-3к). Для площадки на которой вы ведёте курсы я думаю это посильные деньги.
    а можно сделать ещё богаче, поставить два микрофона, 1 в начале зала, другой в середине и в зависимости от того к какому микрофону ближе говорящий, рулить нужный ползунок гейна и громкости на микшере.
    И повторять вопросы не нужно будет. Нужен просто человек который сидел бы в наушниках и не зевал, мониторил звук с микрофонов и рулил микшером.

    • @flashmozzg
      @flashmozzg 5 ปีที่แล้ว

      Уже 2 ДЗ есть.

    • @atommixz
      @atommixz 5 ปีที่แล้ว

      @@flashmozzg а где они опубликованы? Я ниодного нигде не вижу

    • @flashmozzg
      @flashmozzg 5 ปีที่แล้ว

      @@atommixz На странице курса, но нужно быть на него записанным, чтобы их увидеть.

    • @KaraMaslyatam
      @KaraMaslyatam 5 ปีที่แล้ว +2

      На самом деле можно без всего и писать на чистом Си. Трейты нужны как минимум для обобщений, для расширения любых типов и перегрузки операторов. Например, можно принимать дженерик аргумент, для которого реализован трейт AsRef от типа str и можно принимать String и &str. Без трейтов пришлось бы писать две версии или передавать что-то одно. Можно написать свой трейт и реализовать его для любого чужого типа и вызывать новые методы через точку. Также трейты могут быть "динамическими", то есть принимаем не тип с реализацией какого-то трейта статически, а трейт объект и в рантайме его уже ковыряем - об этом Алексей должен рассказать позже.

  • @theden111111
    @theden111111 5 ปีที่แล้ว +2

    У препода плоховато с дикцией, когда ускоряется не разобрать, что он там бормочет

    • @Uni-Coder
      @Uni-Coder 5 ปีที่แล้ว +21

      Потому что молодой, малоопытный.
      А старых преподов по Rust не существует :)

    • @theden111111
      @theden111111 5 ปีที่แล้ว +3

      @@Uni-Coder согласен, никого не хотел обидеть

  • @ranen_by
    @ranen_by 4 ปีที่แล้ว +5

    слишком много в речи жаргонизмов

    • @lizzienovigot
      @lizzienovigot 2 ปีที่แล้ว +3

      В IT это нормально. Кроме того на большинство из таких жаргонизмов или нет русского аналога или ты его точно так же не поймёшь

  • @ilyadruzh
    @ilyadruzh 3 ปีที่แล้ว +2

    У чувака явно двойка по русскому языку была, сложно его недоанглийский слушать.

    • @alexanderxx2982
      @alexanderxx2982 2 ปีที่แล้ว +1

      Может и так. В разработчики берут не за отличное красноречие.

    • @lizzienovigot
      @lizzienovigot 2 ปีที่แล้ว +6

      Доброе пожаловать в IT
      Уверен что на эти англицизмы есть русский аналог, а даже если есть - он тебе будет понятен?

    • @ilyadruzh
      @ilyadruzh 2 ปีที่แล้ว

      @@lizzienovigot конечно, умение придумывать новые смыслы и слова отличает чувака, который умеет придумывать от чувака, который просто заимствует и копирует.

    • @alexey_burkov
      @alexey_burkov ปีที่แล้ว +1

      я бы сказал двойка и по английскому: "API" == апи, "tuple" == тупл и т.д. Не так важно, но слух режет