Skip to content
by Unity Nodes
NEAR Protocol

8. Generic types & traits (Курс Rust на NEAR)

about 1:22:24 long

Nothing is loaded from YouTube until you press play, and then without tracking cookies.

About this video

Все видео курса    • Курс Rust на NEAR (RU)   Совместный курс NEAR & 4ire Labs

Подписывайтесь, чтобы получать обновления о новостях NEAR, акциях, запуске проектов, баунти, хакатонов Русскоязычное сообщество NEAR t.me/near_protocol Твиттер   / near_protocol   Общение с разработчиками t.me/openwebdev

Follow the latest from NEAR Protocol on: Website: near.org Discord: near.chat Blog: near.org/blog Twitter:   / nearprotocol   GitHub: github.com/near github.com/nearprotocol #Blockchain #FutureIsNEAR #NEAR #nearprotocol #rust #wasm #assemblyscript #раст

Transcript

7,279 words

Captions as YouTube publishes them, usually machine-generated, so product and people names can be misheard.

  1. 0:00

    добро пожаловать на нашу восьмую лекцию по 1 школе мы с вами давно не виделись и сегодняшняя тема посвящена теме generics и trade и это уже одна из продвинутых тем и не пугайтесь если вам что-то будет непонятно любом случае можно будет вернуться к этой теме и переслушать или прочитать дополнительные материалы в

  2. 1:06

    любом случае тема достаточно непростая я бы сказал что большей степени угодно поскольку она достаточно объемная но мы постараемся рассмотреть с вами ключевые концепты которые касаются данной темы какие цели сегодня у нас с вами поставленная они сформулировано достаточно лаконично что такое janelle exe когда их применять а мы разберемся в целом что такое сферу их использование рассмотрим

  3. 1:53

    имплементацию с реализации методов для структур данных до этого мы глубоко в эту тему не погружались только в таком в общем виде рассмотрим что что такое trace и сферы их применения и так же разберемся с тем что это нам дает гибкость и практично skoda в сочетании с применением и треть в общем то такие с виду достаточно скромные задача и предлагаю давайте разберёмся с тем что в принципе такое generics

  4. 2:47

    в общем виде это представляет собой обобщенный тебе дано то есть это что это представляет из себя более в таком строгом абстрактном виде если мы с вами представим вам математическую модель как множеством то общем виде generics а отражает эту концепцию то есть мы для типов можем использовать такую вот о общую концепцию как множество то есть вхождения нечто большее в том числе это подразумевает и подмножество

  5. 3:36

    и тем самым дженерики то есть некий обобщенный тип он реализует уже более такую строгую математическую концепцию которая позволяет оперировать более широким набором данных и типов и это позволяет существенно развить дизайн нашей программы сделать с одной стороны более лаконичным другой стороны более логичным и одна из первых задач которые дженерики решают как таковую в общем дублирование кода что по дублированием

  6. 4:30

    кода понимается я покажу на примерах сегодня будет достаточно много примеров чтобы живую увидеть что это себе представляют но в общем виде это позволяет решить одну из проблем когда мы кладем одну и ту же функциональность которая соотносится непосредственно с типами в данном случае это касается не функции а именно типов когда мы можем представить как некий обобщенный тепле били generic data types также решает задачу обобщение типов заданным ограничениям

  7. 5:13

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

  8. 6:04

    есть несколько полей x и y и они являются и типом а и 32 и эта структура у нас оконечные этими типами и давайте мы рассмотрим реализацию конкретного метода для нашей структуры шеи здесь мы видим ключевое слово и мпл implementation и в общем виде описания имплементации достаточно просто то есть ключевое слово impale название структуры в нашем случае это шеек а также как вы понимаете это могут быть и нам с которой мы до этого

  9. 6:55

    рассматривали и дальше у нас есть реализация конкретная функция суммирования и здесь я остановлюсь на некоторых элементах специально обращаю ваше внимание это публичность и приватность как вы видите когда мы описываем структур ушей мы намеренно описываемые как публично то есть мы ее можем использовать за пределами текущего модуля или crate а также обратите внимание это публичные поля структуры то есть если я здесь не

  10. 7:37

    поставлю public pub я извне не буду иметь доступа к этим полям то есть может быть ситуация когда вам необходимо скрыть эти полях это одна из таких хороших возможностей когда к примеру можно пап сделать x и не публичным сделать y то же самое касается и функции в реализации нашей структуры данном случае наверное correct не было бы его рассматривать как некий метод но я хочу обратить внимание что ошибочно

  11. 8:26

    представлять это в виде класса в рости нету классов нет такой модели классов есть модель реализации конкретных методов через implementation и trade и 3 как раз мы сегодня рассматриваем и что из себя представляет описание данного конкретного метода или функции это всего-навсего нам уже хорошо знакомое описание функцию то есть она в общем то ничем особым не отличается кроме одна важная деталь здесь есть ключевое слово сыр это является

  12. 9:07

    обязательным для роста и в случае если вы хотите обращаться к данной структуре с виду шик если же вы не укажете сел то этот метод будет восприниматься как статический и как нетрудно догадаться вы не сможете получить в данном структуры шеи частности полям x или также обращу ваше внимание на бирсан 3 целом он здесь стоит совершенно не случайно это связано с заимствованием соответственно когда здесь стоит

  13. 9:48

    ampersand это значит что собственная структура передается по ссылке но если метр амперсанд не укажем табуле заимствование что это значит на практике на практике когда мы будем использовать нашу функцию с за им самим примеру за метод то у нас получится так что произойдет за им сегодня самой переменной который реализует шею и тоньше мы ее уже просто напросто не можем использовать поскольку она перемещено в тело этой функции это

  14. 10:29

    просто нужно иметь в виду есть ситуации когда необходимо использовать без амперсанда но я думаю с этим будете сталкиваться очень редко прямо-таки очень поэтому вам нужно запомнить реализации функции то что она объявляется через как обычная функция у нее есть а требует видимости pub также я хочу сказать что в россии есть дополнительные атрибуты которые позволяют регулировать видимость примеру здесь можно указать что на публичный для crate

  15. 11:10

    но я этот пример не усложнял это уже как говорится на самостоятельное изучение но такая возможность есть и что это функция делать она всего-навсего берет данные из полей x и y и складывает обращение происходит через точку структуре то есть также как и раньше и давайте себе представим следующую ситуацию у нас есть точно такая же структура но как вы видите что там не поменялось данном случае у нас поменялся теперь это не те jar флот и

  16. 11:57

    как вы видите по факту вообще ничего не поменялось тоже самореализация функция единственная она возвращает другой тип и как увидите если мы сравним эти два примера они друг друга дублируют и возникает логичный вопрос а что же нам с этой радости делать некоторые языки программирования не предоставляют возможности генерализации типов обобщение их раджи предоставляет такую возможность виде generic types и

  17. 12:36

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

  18. 13:27

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

  19. 14:06

    одно из соглашений это то что это буква может характеризовать совершенно конкретный тип примеру если помните на предыдущей лекции я вам рассказывал про кошмар битэмап и так далее и к примеру есть у нас наша структура шейх реализуют к примеру тип которые относятся к бог результате хэш-функцию то логично и и назвать через букву h это будет просто напросто информативным то есть нужно исходить из совершенно конкретного

  20. 14:45

    контекста соответственно когда мы описываем структуру здесь мы указываем какой наименование дженерик тайпа ученого типа и уже в теле самой структуры мы можем активно ее применять в данном случае я применил ее к двум полянке x и y они одинаково типа но это как вы понимаете не обязательно применять ко всем полям применяем применяем только к нужно потому что к примеру у нас там может быть за это и 32 или любой отсюда любой

  21. 15:23

    другой тип и как вы видите в пределах этой структуры мы можем активно использовать наше объявление нашего generic сайта и теперь давайте разберемся что же у нас произошло с нашей имплементации с виду она усложнилась это одна из вещей которая иногда людей немного пугает потому что в россии начинает много появляться вот таких вот квадратных скобочках и некоторые шутники еще там 2015 году

  22. 16:03

    сравнивали эти скобочкой слишком хотя близко эти круглые скобки но тем ни менее со временем вы привыкнете к тому что этих скобочек может быть много но давайте внимательно разберёмся с тем такие исправила описание обобщенных типом или generic tights в имплементации возле ключевого слова implementation нас открывается скобочки в которых описывается опять же таки наш тип которые мы описали описание структуры

  23. 16:42

    зачем это делается этот тип распространяется фактически на все тело имплементации в том числе и на описание то есть структура которой мы реализуем что такое копия я расскажу чуть чуть попозже и как вы видите поскольку у нас наша структура шейп применяет принимает себя обобщенный тип мы объявляем в интро mind рации здесь применяем его вот сюда и как я покажу дальше это может распространяться и на другие случай и обратите внимание что вот это объявление

  24. 17:27

    мы теперь можем использовать вот это вот point элементалей мы теперь можем использовать в теле функции которые мы реализуем имеется в виду вы их описание то есть теперь посмотрите у нас появился метод год x который возвращает дженерик times и как нетрудно догадаться данном случае мы берем x и возвращаем его на поскольку в нашем случае x при описание структуры является дженерик type данном случае т по совершенно

  25. 18:08

    логично что наши типы совпадают и тем самым мы фактически сделали что получилась такая штука что в качестве обобщенного типа мы фактически можем передавать любой тип примеру это может быть intended boolean или наш кастомной типа пример нашей шип какой-нибудь шапкой шип 3g point и так далее то есть мы не ограничены конкретная реализация для определён на вате па и соответственно наша имплементация будет распространяться на все это множество поэтому когда я начал

  26. 18:59

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

  27. 19:41

    структуры и имплементации это привносит а очень большую гибкость в разработку и важным нюансом является то что эти множеством мы можем специфическим и нужным для нас образом ограничивать примеру по специфическим триллионами как это делается мы это в том числе рассмотрим и давайте теперь уже чуть чуть усложню наша задача здесь уже сразу же я ввожу ограничение типа через три копья зачем это делается если я не поставлю этот трек поскольку как вы

  28. 20:25

    видите у нас возвращается без амперсанда привез не ссылочным если бы он возвращался ссылочным то соответственно у нас бы трудности не было поскольку как вы помните раз следит за тем как мы обращаемся с памятью со ссылочными данными и так далее то есть мы не можем своевольно обращаться с переменными вас поскольку есть концепция так называемых life life time а где отслеживается время жизни перемены и случая когда

  29. 21:01

    я бы не использовал trait копи и попытался вернуть переменную x компилятором верного мне ошибку потому что время жизни этой переменной и стекает в пределах вот это вот функции но поскольку в данном примере я специально показываю как использовать ограничения под ограничения подразумевается вот данный треть копи что такое трейд я рассмотрю чуть-чуть попозже просто обратите внимание что

  30. 21:32

    есть такой специфический синтаксис когда через две точки мы делаем перечисление перечисление того какие ограничения накладываются и опять же таки если мы рассмотрим нашу структуру как некое множество то в климин танцы и мы там множество ограниченным по совершенно конкретным критериям и это очень такая удобная математическая модель которая вам поможет ориентироваться с тем как можно настроить дженерик типы под конкретные

  31. 22:10

    ваши задачи пример сегодня мы рассмотрим более подробно детально как это делается я надеюсь это будет достаточно наглядно и так что значит что это значит что ты реализует рид копи это значит что в россии есть встроенный trade которые реализуют копирования данных по умолчанию это относится к числам простым данным к тому что может оперироваться через в том числе через стек к примеру для строки такого сделать уже нельзя и чем преимущество в том что

  32. 22:58

    когда вы уже будете использовать эту структуру шеи вы сможете использовать только те типы которые реализуют этот 3 как что значит и реализует этот тренд мы сегодня в том числе детально рассмотрим идем дальше и теперь давайте мы рассмотрим уже более сложную структуру когда наш метод делать что-то уже плюс-минус полезно как вы видите постепенно наша имплементация усложняется появляется больше скобочек и

  33. 23:37

    много непонятных вложений давайте разберёмся с тем что происходит итак наша задача поменялось у нас есть требования к тому чтобы поля структуры шик x и y складывались при этом обратите внимание что нам совершенно неизвестно какой то тип соответственно поскольку нам неизвестно какой то тип то мы компилятору должны подсказать и дать ограничения для этого типа ограничение опять же таки делаются через трейдер и так первое у нас каждый из этих типов должен реализовывать куб потому что как

  34. 24:20

    вы видите мы а перчики возвращаем не через от пирса и поскольку может произойти заимствования в данном случае то этот рейд должен быть реализован как для x такие-то поскольку у нас x и y одного типа generic type то соответственно она достаточно описать только для generic type это ограничение и здесь уже появляется некая непонятная штука что значит этот плюс это открывающийся скобочки давайте поэтапно разбираться для того чтобы делать баузер

  35. 24:59

    подразумевается что множественное использование других trade of то есть ограничение данном случает ограничения и треть это не только ограничения это и многое что другой я на этом остановлюсь подробнее сейчас что у вас не запутывать просто обратите внимание что если вы хотите применить несколько trade of данное дженерик так это делается через плюс не через запятую не через точку не через скобочки а через плюс то есть это такое математическое

  36. 25:35

    представление бы такая я сегодня буду отсылать немного математики когда нашему множеству мы делаем некие такие пересечения вот теперь представьте себе что одно пересечении мы делаем через копи и соответственно наша область применения ограничивается другое ограничение через плюс мы делаем через и соответственно область применения еще большими уменьшается что это значит примеру у нас может быть типа которое не поддерживает сложения

  37. 26:09

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

  38. 26:48

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

  39. 27:20

    делаете присваивание это значит что вот эта внутренней структуре правильно наверно бы сказать типу или полю который относится к требует мы призываем очень и ты это значит что все результаты сложения которые у нас здесь есть они будут типа нашего обобщенного типа ты то есть если бы я здесь указал ничто другое соответственно компилятор бы долгое трогать и ругался и боюсь что на этом бы всё и закончилось вас может возникнуть вопрос а можно ли добавить

  40. 27:58

    дополнительные 30 generic сайт в принципе можно но если вы его не будете использовать боюсь что компилятор может на это обидится и даже ругаться и как вы видите сейчас у нас нашим расширен на примере появилось множество степеней свободы и так мы можем использовать целое множество типов через generic types мы через стрейты можем накладывать определенные требования к этим типам это значит что эти типы должны реализовывать эти три эти оптические повторюсь и я

  41. 28:40

    покажу как это делается сегодня в нашем случае уже используется целых два примеру если мы захотим большее количество то это листики мы пишем через плюс и указан необходимый нам trade и как вы видите через достаточно лаконичную форму мы получаем очень мощный инструмент для разработки и самое главное дизайна приложения и давайте рассмотрим пример где мы можем использовать несколько

  42. 29:11

    generic тает этот пример немного надуманный конечно но тем не менее он репрезентативны как вы видите мы расширили нашу структуру шейк с помощью двух generic тарпа опять же такие одна из распространенных таких наименований когда нам неизвестно какой тип будет и на что мы вообще подписываемся это т.ю. в документации и вразбег и сам вы увидите что это наиболее часто используемая потому что ей это следующая

  43. 29:54

    буква после ты и обратите внимание что в данном случае мы добавляем еще одну переменную в поле для структуры которые реализуют уже другой generic стары и 1 и специфика заключается в том что если вы хотите добавить еще один generic толпы торсионов свои делается через запятую все достаточно просто единственное что если вы описываете вы по этой структуре должны использую и опять же таки обратите внимание что описание происходит через

  44. 30:26

    большие буквы это имеет значения потому что компилятор по-прежнему расстроится что произошло с нашей имплементации так вы видите функция сам у нас не поменялось добавилось функция get z и поменялось определение имплементации как видите здесь уже появился расширенный набор на этой части я не буду останавливаться а там где у нас you как вы видите здесь у нас тоже есть ограничения но через три то есть

  45. 31:10

    это значит что это тип должен реализовывать в данном случае копи всего-навсего копи потому что в нашем случае мы не возвращаем эта перемена это переменная соответственно является дженерик тайпом you что это значит это значит что фактически мы можем использовать здесь два разных типа то есть для x и y примеру мы можем использовать eager а для z мы можем использовать floor и это также будет распространяться

  46. 31:43

    на имплементацию и также обратите внимание поскольку здесь мы описывая наши generic темп комплиментации то когда мы обращаемся к типу вот здесь вот описание опять же таки мы обязательно должны указывать что какие дженерик type он применяет данном случае это имеет значение как вы видите мы получили в жертву более расширенную комплексную модель и научились фактически делать что множество использование разных generic type то есть фактически в нашем

  47. 32:29

    случае это два множества которые не пересекаются и соответственно мы расширили нашу имплементацию которая позволяет опереть от лидировать ума разными наборами множество типов соответственно 2 дженерика data type целью это выглядит достаточно лаконично и по и позволяет по факту избавиться от большого количества дублирования кода которая могла бы необходимо быть сделано примеру если нам необходимо реализовать это для типа boolean для интеджер и так далее без

  48. 33:12

    generic то нам пришлось бы это делать вручную и это и не весело выглядит с точки зрения дизайна и с точки зрения кода и его поддержания давайте рассмотрим как у нас generic используется так это мы рассмотрели как у нас дженерики используется более упрощенном виде то есть как вы видите здесь у нас есть такая громоздкая запись где мы в одну строку все это складываем и выглядеть это не эстетично представьте себе ситуацию когда у нас достаточно большое количество объявлений для этого в расти

  49. 34:04

    я существует как-то некрасиво на форматированного 1 существует ключевое слово в я как вы видите здесь вообще ничего поменялась поскольку имплементация осталось точно такой же но как видите здесь включим слова и мпл квадратная скобка всего носова и идет целью то есть очень лаконично запись появилась ключевое слово это значит что мы уже здесь более подробные детали и описываем какие три ты должен реализовывать каждый листик у то есть

  50. 34:45

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

  51. 35:25

    та же самая логика распространяется на функции обратите внимание на один аспект что вы описывается до открывания фигурных скобок структура следующее у нас есть имплементация где мы описываем generic так и для имплементация нас есть конкретная структура которая принимает эти generic тайка и в данном случае мэр описан какие trade и каждое из этих generic type принимает и это все да

  52. 36:01

    фигурных скобок важным таким нюансам нужно понимать что очевидно что если у нас для структуры нету generic то и папку например вот здесь вот как бы не было to implement once это же нам нет необходимости это все дело описывать это касается только случая где у нас происходит описание generic это фактически такое украшательства которое существенно упрощает жизнь разработчики поскольку выглядеть я вам симпатичны и давайте рассмотрим как же

  53. 36:43

    эти ограничения о которых наговорили применяется конкретные функция как вы видите те тип шее у нас то же самое а вот функция кое-что поменялось и здесь синтаксис он уже выглядит как как как к вы заметили по другому давайте разберемся сначала у нас идет ключевое слово faction и нас имя функции нашем случае сам поскольку он суммирую и здесь уже мы описываем generic type и непосредственно сразу же после имени функции то есть нашем случае это т и мы

  54. 37:30

    сразу же описываем какие trade и это generic type должен реализовывать нашем случае это купе и практически вот эта запись она энергично тому что мы видели в имплементация вот здесь и вот в этой части в том числе как вы видите и в этом смысле просто есть смысл запомнить что после и мне функция есть у нас тут же нарик т.п.

  55. 38:09

    мы их описываем сразу же вот здесь и дальше у нас есть параметр функция которые могут принимать дженерик тайпа нашем случае это наша структура шейп который принимает generic type ты и так же происходит возврат этого же самого generic type a важно обратить внимание что если мы не пишем этот generic той то мы не сможем описать вот эту структуру тип данных которые у нас нашем случае фильм

  56. 38:50

    это значит что если мы хотим воспользоваться этим типом мы должны описать в самой функции в данном случае в самой функции этот generic тает и поскольку опять же таки нам неизвестно тип который возвращается мы опять таки возвращаемся на самом деле совершенно ничего нового единственная с чем нас новым познакомились это то что мы теперь можем передавать нашу структуру generic тайпом как параметр функция вот здесь вот и функциям мы можем описывать сам

  57. 39:29

    generic times и трети которой он должен реализовывать c700 достаточно просто давайте посмотрим как же происходит вызов как вы видите вызовов происходит достаточно просто в нашем случае мы через слой описываем переменную нашего типа примеру the ship а и 32-ку видите здесь мы а быть совершенно любой тип и важным аспектом является то что например если мы посмотрим сюда видите у нас должен быть реализован на треть купе и данном случае 32 по умолчанию в

  58. 40:15

    стандартной библиотеке поскольку это примитивных он его реализую ну и здесь соответственно мы инициализируем саму структуру таким очень простым способом и теперь обратите внимание что происходит с вызовом функции вот вот это вот функция листается медленно вот этой функции сам обратите внимание что сначала мы указываем имя функции и через двойное двоеточие указываем наш generic type мы явным видом явным образом его указываем на самом деле

  59. 41:08

    именно в данном примере это можно было бы не делать поскольку у нас вот здесь вот шипа и 32 указано какого типа наши generic type поскольку он тут же самым но для наглядности я показываю вам как вообще явным образом происходит описание generic типа функции и опять же таки следующие когда мы получили наши пример мы можем вызвать наш метод сам который был описан ранее вернее это не он вот этот папа верите в

  60. 42:03

    данном случае тип у нас не определён и мы вызываем метод сам и у нас соответственно произойдет сложение это будет меня здесь тоже самое произойдет с функцией которая опять же таки принимает шеи дженерик type a и 32 мы получим точно такой же результат то есть фактически что на выходе мы имеем как вы видите вызов структуры очень простое и а фактически не накладывает никаких ограничений единственное что нам необходимо при объявлении переменной явным образом

  61. 42:48

    указать нашу структуру что она реализует это как бы небольшие одни расходы функция тоже самое мы в данном случае можно было бы это не указывать но иногда бывает такой случай когда компилятору нужно помочь им и явным образом можем указывать наши дженерик так данном случае дойти до и опять же я повторюсь что мы можем использовать любые типы данных которые реализуют это generic time & trade и

  62. 43:27

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

  63. 44:06

    на уровне типов мы можем решить целый комплекс задач в этом смысле конечно эти элементы относятся к функциональному программирование и к языкам чисто функциональным многие из элементов расти не реализованы частности там гарри рования класса типов pendants многое другое генерализированные тракт и данные но тот функционал который есть он достаточно для того чтобы всего-навсего на уровне типов ограничить себя от множества проблем которые могут быть и в

  64. 44:55

    данном случае generic types это является одним из таким очень гибких инструментов и с другой стороны и не побоюсь этого слова мощно надеюсь что generic такса вопросов особо не возникло поэтому давайте двигаться дальше троица и для чего на самом деле стритами мы уже немножко немножко познакомились и давайте в целом рассмотрим что это такое и для чего они нужны по факту в общем виде по 3 является трактом описанием функции применима к другим типом как вы видели в

  65. 45:46

    предыдущих примерах для generic type of это очень хорошего применимо и это накладывает ограничение на то что они должны их применять но в целом если для вас не очень такой знакомый приятный на слух слова триц то в принципе их можно воспринимать как некий аналог интерфейс у других языках ясно что с неким ограничением поскольку каждый язык накладывает свои специфические требования к реализации интерфейса и так далее по нашему примеру

  66. 46:31

    в гоу они сделаны совсем по-другому ну как бы не совсем по другому но некоторые концепцию там отличается нам частности там использование через звездочку не звездочку через наследование trade of интерфейсов здесь это так не работает поэтому мы углубиться в то как это все таки делается в общем виде как происходит объявлению соответственно когда мы видим слов об это паблик ключевое слово trade говорит нам о том

  67. 47:17

    что мы описываем объявляем данный привет колки это лишь говорит о названии и как и везде в россии принято что кейса наименование для типов тоже самое относится к трейдом лесные кисло для описания функции перемен и как вы видите здесь мы описываем некие абстрактные методы которые реализуют должен реализовать даны три или интерфейс давайте рассмотрим первый случай не у неё как вы видите это статический метод поскольку

  68. 48:03

    он себя не принимается и это значит что данный 3 я должен реализовывать статический метод new которые возвращают и здесь у нас есть новое ключевое слово сел с большой буквы это значит что он возвращает тип той структуры которая реализует данный трек примеру если у нас ой 32 реализует trade mall калешин то это значит что при объявлении эти структуры нам даже не нужно будет менять вот раз компилятора

  69. 48:38

    самостоятельно поймут что сел это тот тип который реализует данный трек все достаточно просто и так мы уже увидели с вами статический метод напомню что статический метод нему не может обращаться полям структуры которого он реализует для этого необходим cells дальше мы видим объявление с как видите здесь есть цель и есть дополнительная переменная x которая и 32 и здесь я уже как бы не

  70. 49:19

    буду вдаваться подробности просто обратите внимание что здесь есть разные виды описания функции обращу внимание также на чейни czech в данном случае явным образом описывает что наша структура которая вызывает этот рейс нам это реально new табу и это значит что мы данные которые относятся к этой структуре можем менять это относится в том числе и для имплементация то есть если мы хотим менять данные самой структуры возвращаемся на самом деле это далеко не

  71. 50:05

    самая хорошая практика это делать лучше бы делать лучше саму функций оставлять чистый почистить развивается что структура которая содержится самой функция она не меняется если нам нужно что-то вернуть то пожалуй лучше было бы если бы вы ее вернули но иногда бывает такой случай когда там может быть большой объем данных и в таком случае у нас может происходить перемещение памяти и это накладная операция поэтому есть смысл исходя

  72. 50:47

    исходить из конкретной задачи и сугубо рациональных целей и вот одна из таких необычных записи когда у нас здесь описаны конкретная реализация функции это дефолтное описание это значит что если мы не пишем этот эту функцию в трети то она будет по умолчанию именно такой x-men с этим что это значит это значит что все функции кроме sap масла они обязательно должны быть реализованы

  73. 51:24

    все по умолчанию не обязательно поскольку она уже реализована но это не значит что она мне нужно реализовывать потому что если у нас есть какие-то другие требования то мы не можем написать и акционер по умолчанию реализация будет изменена но такое очень удобно и определение когда есть реализация помолчи и возможно вы обратили внимание на такую странную вещь что для функции здесь нигде нету паблика это что в треке

  74. 52:00

    они по умолчанию все публично поскольку они реализуются для другие другого набора типов все достаточно просто и давайте разберемся как trade работают с generic тарифам как вы верите мы используем прежнюю структуру с нашим шейхом и у нас примеру есть определенный интерфейс который должен для определенного набора generic type of реализовываться суммирование и как вы видите здесь все достаточно просто то есть мы описываем public trade и здесь мы в явном виде указываем что этот trade

  75. 52:53

    содержит дженерик time и когда мы описываем функцию суммирования здесь мы явным видом в явном виде указывая что тип который возвращается это generic times то есть гибкость на лицо что для данного интерфейса или трейда мы можем использовать все множество типов для того чтобы происходило суммирование и давайте посмотрим на конкретную реализацию как вы видите мы используем все тоже нашу прежнюю структуру шеи она не изменилась

  76. 53:38

    и также обратите внимание что реализация в том числе не изменилась но важным аспектом является следующим когда мы здесь описано имплементация как видите как и прежде у нас есть straight копи 3 н и это значит что он реализуется для этого типа и важной особенностью является то что мы отдельным образом реализуем trait шибко лт для структуры шею что это значит здесь наглядно видно следующее что у нас здесь используется к примеру thread копи

  77. 54:27

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

  78. 55:01

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

  79. 55:44

    конкретных типов и это огромнейшая гибкость потому что мы целый набор интерфейсов можем реализовать для наших структур оскаре этому соответствует класс типу если кто хаски интересовался и давай детально посмотрим как это работает уже с ограничением типа мы если раньше описывали ограничение типа через через : как вы помните для конкретных типов как вот здесь вот в нашем случае мы уже ограничение типа делаем для нашего трека

  80. 56:31

    как вы видите соответственно generic так ты должен реализовывать наш trade and ship kalkweiss который внутри себя принимает generic таре и также как мы видим здесь описывается наша структура шик и для того чтобы упростить запись мы уволим опять ключевое слово в и описываем какие еще дополнительные trade и должны быть реализован обратите внимание что здесь у нас появилась фактически 4 3 копии мы уже с ним знакомы с тоже с ним знакома также

  81. 57:10

    появился сам поскольку у нас как видите здесь происходит вычитанию ну и четвертый это наша наша личная реализация шеи бутылки литр и давайте теперь посмотрим на хоть что новая в реализация самой функции то есть у нас есть наша отдельная функция ракал compilation и она имеет переменную z которая принимает generic type и как вы видите generic так ты у нас должен реализовывать 4 trade a ship как толко лично копия it и сам это значит что мы каждом из них

  82. 57:54

    можем оперировать поэтому мы обращаемся в теле функции к методу сам самаре и соответственно делаем учит они и как вы видите чего не прекращается так вы видите здесь мы описываем trade его реализация здесь но уже описываем ограничение трейдеры как мы с ним взаимодействием поэтому смотрите вот здесь у нас есть 3 который называется шибко который вызывает функцию sum самаре это достаточно это в описании и здесь мы

  83. 58:44

    уже фактически здесь фактически мы уже реализуем эту функцию через я извиняюсь вылезла через обращение к методу сам то есть все достаточно просто с одной стороны здесь у нас реализация метода другой стороны здесь у нас обращение 5 ментами в чем гибкой заключается в том что фактически объявляю generic type у нас автоматически у него уже есть возможность обращаться к определенным методом

  84. 59:30

    и всего-навсего с одной стороны это generic т а с другой стороны поскольку он реализует конкретный trade нашем случае шер куклы то соответственно мы можем обращаться не только к его поля с нашим случаев и к примеру поскольку но и конкретным методам которые реализованы в данном треки и давайте рассмотрим уже еще одно дополнительного концепцию это трейд и в как параметры функции здесь существует

  85. 1:00:08

    еще один специальный набор ключевых слов и что это из себя представляет как вы видите по прежнему наша структура уже расширенное она реализует 3g talk литр вот наша функция которой никак не изменилась и у нас появилась дополнительный метод сочетание и в нашем случае мы к примеру хотим чтобы это был не generic type a мы передаем параметры непосредственно трэйд это значит следующее что наша переменная параметр функции z принимает

  86. 1:00:52

    непосредственно сам 3 как это делается а бирсан соответственно как вы понимаете указывать на сущность типа для trade of это необходимо и ключевое слово implantation и мпл и название trade а с указанием его generic тайпа и соответственно мы достаточно легко можем обратиться к методу этого трека сам и вычесть его из структуры шеи и вот здесь раскрывается фактически ещё одна дополнительная мощь generic

  87. 1:01:31

    type of которая до этого была не столь наглядно это когда здесь в имплементации мы описываем generic type t и мы его прокидывая описание trade а вот здесь вот фактически то есть это значит что мы его можем описать отдельно ректор и про кинуть его в треть который для имплементация функция и в том числе для возврата функция это значит что набор инструментов для дизайна рынке такого дизайна приложения бросьте он достаточно большой и

  88. 1:02:11

    предоставляет большую гибкость то есть как вы видите у нас есть два типа обращения 1 через со generic так что одновременно мы можем обращаться и полям структуры и к типу и с другой стороны мы можем как параметр функция передавать непосредственно сам trade или прочего интерфейс и обращаются уже к его метода это вновь эту такую достаточно большую гибкость и опять же таки я вам напомню следующее что если вы хотите объединить

  89. 1:02:56

    несколько треков то это делается через сложение вот таким вот образом как вы видите здесь в расти проявляется одна из специфик что здесь может быть достаточно много таких скобочек их и временами может быть очень много некоторых это смущает но если вы пользуетесь нормальному т.е.

  90. 1:03:21

    который умеет подсвечивать фигурные скобочки с одной стороны а с другой становится временем вы к этому просто привыкните то в общем то в этом особых никаких проблем не должно быть и давайте разберёмся с тем какие у нас в общем-то материалы есть по теме я специально сделал такую подборочка которая которая касается generic type of [музыка] trade of и совершенно конкретных примеров разбег сам я думаю что потом по

  91. 1:04:06

    не можете перейти перейти и уже более детально ознакомиться суммируя я хочу сказать следующее что generic т.п. кирил обобщенные типы данных они позволяют оперировать множеством и под множеством типов что существенно расширяет возможность написания приложений и дизайна и 3 позволяют реализовывать со разного рода абстрактные инструменты тем самым расширяя функциональность поскольку как вы видите мы можем передавать его и как generic тает и как параметр

  92. 1:04:56

    функции и самым разным способам то это существенно расширяет возможности по реализации примеру когда вы реализуете свою какую-то библиотеку то правильный дизайн может решить все потому что вы не знаете как количеством пользователя будете пользоваться и соответственно если не сильно злой злоупотребляем но достаточно продуманно вы будете использовать generic type или trade и которые будут ограничивать этот тип тем самым вы

  93. 1:05:27

    можете создать очень гибкую структуру данных с одной стороны и библиотеку а с другой стороны дизайн которые позволят перес пользовать вашу библиотеку в самом широком спектре приложений только благодаря тому что у вас хороший дизайн приложения то есть дженерика дата танцы и и 3 ты это про уже более такой абстрактный взгляд на приложение как бы со стороны с высока когда вы приложение можете конструировать

  94. 1:06:09

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

  95. 1:06:54

    перед слушает а с другой стороны обратиться к этим источникам документации и прочитать там тоже достаточно много об этом написано я даже сказал что есть расширенный набор который касается lifetime of life time и мы намеренно не рассматриваем потому что это большая тема и она одну лекцию не влезет у нас достаточно большие планы потому как двигаться дальше окей и тогда думаю мы можем уже перейти к вопросам

  96. 1:07:53

    сори пора на тренировку хорошей тренировки так пропал вопрос напишите еще раз есть если вопрос пропал как лучше считается что на футболке аврора написано на футболке так сейчас я пока чтобы рассмотрел час чат так вопросы и ответы могут ли тирию совпадать при использовании смотрите целью это всего-навсего наименование generic той что это значит это значит что по каким-то причинам мы их разделили

  97. 1:09:00

    и скорее всего если в обобщенном виде говорить они реализуют разные множество и возможно эти множества пересекаются или возможно не пересекаются если я слишком избыточно употребляют слово множество вы меня извините но мне так легче как бы визуально это представить поэтому скорее всего они все-таки не совпадают поскольку вы же намеренно это это разграничение делали но если у вас есть

  98. 1:09:37

    потребность в том чтобы у них были некоторые совпадения то то через три это через реализацию 3 это вы это можете сделать но опять же таки это нужно рассматривать и совершенно конкретного случая поскольку это очень такой абстрактный вопрос его нужно нужно рассматривать для конкретного случая поэтому я очень кратко отвечу так дальше вадим почему типа gene genelec функции указывается именно через двойное двоеточие это такое

  99. 1:10:24

    синтаксический элемент на самом деле он относится к много чему к примеру когда мы обращаемся через или через описание определенного метода это распространенная такая практика поэтому почему это дизайн языка единственное что конечно это немного непривычно и как сказать по сравнению с другими языками программирования потому что к этому синтаксиса нужно привыкнуть этому я отвечу просто что это дизайн языка дальше почему метод и тв trade of the

  100. 1:11:21

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

  101. 1:12:22

    реализовывал тип купе это именно связано с тем что в том описание которую вы показали он без ampersand атеистом происходит зависть заимствование rhs соответственно правая часть но смотрите если бы он не заимствовал элемента тут же дело в том что это реализуется для примитивных типов и по всей видимости самореализация которую они сделали она требует этого то есть я в данном случае к мечу что это

  102. 1:13:13

    специфика реализации следующий вопрос почему метод не понял а это максим говорил что у него этот вопрос пропал но по факту он не пропал не почти не пришлось бы требовать и купи но опять же какие-то внутренние реализация и по всей видимости нужно на самом деле посмотреть как не реализует но я думаю что это логически обосновать

  103. 1:14:14

    задавайте еще вопросам так максим но я ваш вопрос дважды увидел так что все редко не знаю почему их не видно но пока это специфика зума возможно смотрите пишите лучше укосины финансово так будет проще почему типа gun рик функции указываются именно через двойной : потому что иначе будет неоднозначность ну да но посмотрите там же с одной стороны у нас происходит описание то есть декларация с другой стороны когда мы через двоеточие делала

  104. 1:15:16

    металлу и за поскольку как вы видели у нас двойное двоеточие области говорит о конкретном вызове ну или конкретному обращению об теперь ответы видно задавайте вопрос целом жить и мне в чате напишите насколько вам понятно и какие что осталось непонятно поскольку тема такая интересная достаточно поскольку она раскрывает уже такие глубины самого роста я не знаю чем они руководствовались я реализацию этой функции не видел но

  105. 1:16:18

    логика у этих действий есть поскольку при сложении там должна происходить заимствование реализации the fans ну да ну здесь передавать ровно щит вместо буровым как говорит кирилл задавайте

  106. 1:17:23

    просо у нас есть еще немного времени так ампир это не займет заимствование то ссылочную переменную то есть когда мы без нее соответственно происходит заимствования

  107. 1:18:38

    давайте просто по сегодняшней теме неужели больше вопросов о вас нет все понятно

  108. 1:20:22

    а вот вопрос бокс и будем изучать нет бокса мы не будем это чай но faq чески что они делают это работа с кучей уже более только продвинутая тема смотрите я на самом деле боксы бы рассматривал наверно больше в контексте lifetime но lifetime и мы не рассматриваем не рассматриваем большому сожалению по очень простой причине что у нас уже получается достаточно большой сюда входит и нир смарт-контракты и

  109. 1:21:12

    polka dot и them a lifetime of она весьма обширная богатая на всякого разного рода подводных камня человечки окно поскольку вопросов больше нету по всей видимости я предлагаю совершать желаю вам хороших продуктивных выходных если у вас возникнут вопросы вопросы пишите в телеграм и очень рекомендую вам ознакомиться с документацией в том числе и раст баек запас многое там для нас прояснится в том числе

  110. 1:22:24

    сегодня во всем пока