Slide 1

Slide 1 text

Въведение Rust? TDD Памет ООП Заключение Rust за практичния програмист Петко Борджуков PlovdivConf 6 юли 2013 г.

Slide 2

Slide 2 text

Въведение Rust? TDD Памет ООП Заключение За лектора Петко

Slide 3

Slide 3 text

Въведение Rust? TDD Памет ООП Заключение За лектора Петко занимава се с Ruby и Rails

Slide 4

Slide 4 text

Въведение Rust? TDD Памет ООП Заключение За лектора Петко занимава се с Ruby и Rails

Slide 5

Slide 5 text

Въведение Rust? TDD Памет ООП Заключение За лектора Петко занимава се с Ruby и Rails @ignisf

Slide 6

Slide 6 text

Въведение Rust? TDD Памет ООП Заключение За лектора Петко занимава се с Ruby и Rails @ignisf http://gplus.to/ignisf

Slide 7

Slide 7 text

Въведение Rust? TDD Памет ООП Заключение За лектора Петко занимава се с Ruby и Rails @ignisf http://gplus.to/ignisf https://github.com/ignisf

Slide 8

Slide 8 text

Въведение Rust? TDD Памет ООП Заключение Кратката история на Rust

Slide 9

Slide 9 text

Въведение Rust? TDD Памет ООП Заключение Кратката история на Rust Започнат през 2006 г. като личен проект на Грейдън Хауър, служител на Mozilla

Slide 10

Slide 10 text

Въведение Rust? TDD Памет ООП Заключение Кратката история на Rust Започнат през 2006 г. като личен проект на Грейдън Хауър, служител на Mozilla Mozilla се включва през 2009 г.

Slide 11

Slide 11 text

Въведение Rust? TDD Памет ООП Заключение Кратката история на Rust Започнат през 2006 г. като личен проект на Грейдън Хауър, служител на Mozilla Mozilla се включва през 2009 г. Първа алфа на компилатора през януари 2012 г.

Slide 12

Slide 12 text

Въведение Rust? TDD Памет ООП Заключение Кратката история на Rust Започнат през 2006 г. като личен проект на Грейдън Хауър, служител на Mozilla Mozilla се включва през 2009 г. Първа алфа на компилатора през януари 2012 г. Версия 0.7 – преди няколко дни

Slide 13

Slide 13 text

Въведение Rust? TDD Памет ООП Заключение Кратката история на Rust Започнат през 2006 г. като личен проект на Грейдън Хауър, служител на Mozilla Mozilla се включва през 2009 г. Първа алфа на компилатора през януари 2012 г. Версия 0.7 – преди няколко дни Стабилна версия – до края на годината

Slide 14

Slide 14 text

Въведение Rust? TDD Памет ООП Заключение Парадигми

Slide 15

Slide 15 text

Въведение Rust? TDD Памет ООП Заключение Парадигми Компилируем

Slide 16

Slide 16 text

Въведение Rust? TDD Памет ООП Заключение Парадигми Компилируем Функционален (горе-долу)

Slide 17

Slide 17 text

Въведение Rust? TDD Памет ООП Заключение Парадигми Компилируем Функционален (горе-долу) Конкурентен (по модела на актьорите)

Slide 18

Slide 18 text

Въведение Rust? TDD Памет ООП Заключение Парадигми Компилируем Функционален (горе-долу) Конкурентен (по модела на актьорите) Императивно-процедурен

Slide 19

Slide 19 text

Въведение Rust? TDD Памет ООП Заключение Парадигми Компилируем Функционален (горе-долу) Конкурентен (по модела на актьорите) Императивно-процедурен Обектно ориентиран

Slide 20

Slide 20 text

Въведение Rust? TDD Памет ООП Заключение Фокус върху

Slide 21

Slide 21 text

Въведение Rust? TDD Памет ООП Заключение Фокус върху Type safety

Slide 22

Slide 22 text

Въведение Rust? TDD Памет ООП Заключение Фокус върху Type safety Memory safety

Slide 23

Slide 23 text

Въведение Rust? TDD Памет ООП Заключение Фокус върху Type safety Memory safety Concurrency

Slide 24

Slide 24 text

Въведение Rust? TDD Памет ООП Заключение Фокус върху Type safety Memory safety Concurrency Performance

Slide 25

Slide 25 text

Въведение Rust? TDD Памет ООП Заключение Практична функционалност от по-високо ниво

Slide 26

Slide 26 text

Въведение Rust? TDD Памет ООП Заключение Практична функционалност от по-високо ниво Type inferrence

Slide 27

Slide 27 text

Въведение Rust? TDD Памет ООП Заключение Практична функционалност от по-високо ниво Type inferrence Safe task-based concurrency

Slide 28

Slide 28 text

Въведение Rust? TDD Памет ООП Заключение Практична функционалност от по-високо ниво Type inferrence Safe task-based concurrency Функции от по-висок ред

Slide 29

Slide 29 text

Въведение Rust? TDD Памет ООП Заключение Практична функционалност от по-високо ниво Type inferrence Safe task-based concurrency Функции от по-висок ред Полиморфизъм

Slide 30

Slide 30 text

Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме от Rust? Какво е кофти в Ruby?

Slide 31

Slide 31 text

Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме от Rust? Какво е кофти в Ruby? Конкурентността

Slide 32

Slide 32 text

Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме от Rust? Какво е кофти в Ruby? Конкурентността Конкурентността!!1

Slide 33

Slide 33 text

Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме от Rust? Какво е кофти в Ruby? Конкурентността Конкурентността!!1 Гаранциите за сигурност

Slide 34

Slide 34 text

Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме от Rust? Какво е кофти в Ruby? Конкурентността Конкурентността!!1 Гаранциите за сигурност Много променливи състояния

Slide 35

Slide 35 text

Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме от Rust? Какво е кофти в Ruby? Конкурентността Конкурентността!!1 Гаранциите за сигурност Много променливи състояния Бавен е

Slide 36

Slide 36 text

Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме от Rust? Какво е кофти в Ruby? Конкурентността Конкурентността!!1 Гаранциите за сигурност Много променливи състояния Бавен е Сложен е (семантиката на Smalltalk се събира на листче)

Slide 37

Slide 37 text

Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме от Rust? Какво е яко в Ruby?

Slide 38

Slide 38 text

Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме от Rust? Какво е яко в Ruby? Блоковете

Slide 39

Slide 39 text

Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме от Rust? Какво е яко в Ruby? Блоковете Тове, че е функционален

Slide 40

Slide 40 text

Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме от Rust? Какво е яко в Ruby? Блоковете Тове, че е функционален Синтаксисът е горе-долу лесен

Slide 41

Slide 41 text

Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме от Rust? Какво е яко в Ruby? Блоковете Тове, че е функционален Синтаксисът е горе-долу лесен Прави разработчиците щастливи.

Slide 42

Slide 42 text

Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме от Rust? Какво е яко в Ruby? Блоковете Тове, че е функционален Синтаксисът е горе-долу лесен Прави разработчиците щастливи. Програмира се бързо с него

Slide 43

Slide 43 text

Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме от Rust? Какво е яко в Ruby? Блоковете Тове, че е функционален Синтаксисът е горе-долу лесен Прави разработчиците щастливи. Програмира се бързо с него Динамично типизиран е

Slide 44

Slide 44 text

Въведение Rust? TDD Памет ООП Заключение Популярният пример

Slide 45

Slide 45 text

Въведение Rust? TDD Памет ООП Заключение Популярният пример Hello World fn main () { println("hello?"); }

Slide 46

Slide 46 text

Въведение Rust? TDD Памет ООП Заключение Популярният пример Hello World fn main () { println("hello?"); } Прилича ли ви на нещо познато?

Slide 47

Slide 47 text

Въведение Rust? TDD Памет ООП Заключение Още познати неща

Slide 48

Slide 48 text

Въведение Rust? TDD Памет ООП Заключение Още познати неща Parallel Hello World fn main ( ) { for 1 0 . t i m e s { do spawn { l e t greeting_message = " Hello ? " ; p r i n t l n ( greeting_message ) ; } } }

Slide 49

Slide 49 text

Въведение Rust? TDD Памет ООП Заключение Още познати неща Parallel Hello World fn main ( ) { for 1 0 . t i m e s { do spawn { l e t greeting_message = " Hello ? " ; p r i n t l n ( greeting_message ) ; } } } Познато? 1 0 . t i m e s do Thread . new do greeting_message = " Hello ? " puts greeting_message end end

Slide 50

Slide 50 text

Въведение Rust? TDD Памет ООП Заключение Приличия между Ruby и Rust Променливите са в snake_case

Slide 51

Slide 51 text

Въведение Rust? TDD Памет ООП Заключение Приличия между Ruby и Rust Променливите са в snake_case Имаме блокове, които използват {}

Slide 52

Slide 52 text

Въведение Rust? TDD Памет ООП Заключение Приличия между Ruby и Rust Променливите са в snake_case Имаме блокове, които използват {} Въпреки че промеливите са статични типизирани, имаме type inferrence, така че няма нужда да декларираме типове

Slide 53

Slide 53 text

Въведение Rust? TDD Памет ООП Заключение Приличия между Ruby и Rust Променливите са в snake_case Имаме блокове, които използват {} Въпреки че промеливите са статични типизирани, имаме type inferrence, така че няма нужда да декларираме типове Ще видим още прилики по-нататък

Slide 54

Slide 54 text

Въведение Rust? TDD Памет ООП Заключение Различия между Ruby и Rust ; (почти) навсякъде

Slide 55

Slide 55 text

Въведение Rust? TDD Памет ООП Заключение Различия между Ruby и Rust ; (почти) навсякъде Нямаме блокове, които използват do и end

Slide 56

Slide 56 text

Въведение Rust? TDD Памет ООП Заключение Различия между Ruby и Rust ; (почти) навсякъде Нямаме блокове, които използват do и end Малко по-различен синтаксис за дефиниране на функция: fn вместо def

Slide 57

Slide 57 text

Въведение Rust? TDD Памет ООП Заключение Различия между Ruby и Rust ; (почти) навсякъде Нямаме блокове, които използват do и end Малко по-различен синтаксис за дефиниране на функция: fn вместо def Понеже нямаме do и end, използваме {} навсякъде

Slide 58

Slide 58 text

Въведение Rust? TDD Памет ООП Заключение Различия между Ruby и Rust ; (почти) навсякъде Нямаме блокове, които използват do и end Малко по-различен синтаксис за дефиниране на функция: fn вместо def Понеже нямаме do и end, използваме {} навсякъде Компилаторът ни се кара повече, ако сгрешим

Slide 59

Slide 59 text

Въведение Rust? TDD Памет ООП Заключение Различия между Ruby и Rust ; (почти) навсякъде Нямаме блокове, които използват do и end Малко по-различен синтаксис за дефиниране на функция: fn вместо def Понеже нямаме do и end, използваме {} навсякъде Компилаторът ни се кара повече, ако сгрешим При писане на Rust трябва да се следва PEP8 Style Guide

Slide 60

Slide 60 text

Въведение Rust? TDD Памет ООП Заключение Различия между Ruby и Rust ; (почти) навсякъде Нямаме блокове, които използват do и end Малко по-различен синтаксис за дефиниране на функция: fn вместо def Понеже нямаме do и end, използваме {} навсякъде Компилаторът ни се кара повече, ако сгрешим При писане на Rust трябва да се следва PEP8 Style Guide ВСИЧКО е immutable по подразбиране.

Slide 61

Slide 61 text

Въведение Rust? TDD Памет ООП Заключение Различия между Ruby и Rust ; (почти) навсякъде Нямаме блокове, които използват do и end Малко по-различен синтаксис за дефиниране на функция: fn вместо def Понеже нямаме do и end, използваме {} навсякъде Компилаторът ни се кара повече, ако сгрешим При писане на Rust трябва да се следва PEP8 Style Guide ВСИЧКО е immutable по подразбиране.

Slide 62

Slide 62 text

Въведение Rust? TDD Памет ООП Заключение Различия между Ruby и Rust ; (почти) навсякъде Нямаме блокове, които използват do и end Малко по-различен синтаксис за дефиниране на функция: fn вместо def Понеже нямаме do и end, използваме {} навсякъде Компилаторът ни се кара повече, ако сгрешим При писане на Rust трябва да се следва PEP8 Style Guide ВСИЧКО е immutable по подразбиране. Да, дори променливите

Slide 63

Slide 63 text

Въведение Rust? TDD Памет ООП Заключение Фреймуърк за тестване В Rust има вграден прост фреймуърк за писане на unit тестове.

Slide 64

Slide 64 text

Въведение Rust? TDD Памет ООП Заключение Фреймуърк за тестване В Rust има вграден прост фреймуърк за писане на unit тестове. Не е RSpec, но хайде да не бъдем претенциозни...

Slide 65

Slide 65 text

Въведение Rust? TDD Памет ООП Заключение Фреймуърк за тестване В Rust има вграден прост фреймуърк за писане на unit тестове. Не е RSpec, но хайде да не бъдем претенциозни... testing.rs #[test] fn this_tests_code () { println("") }

Slide 66

Slide 66 text

Въведение Rust? TDD Памет ООП Заключение След това компилираме тестовете и ги пускаме с командата $ rustc --test testing.rs $ ./ testing

Slide 67

Slide 67 text

Въведение Rust? TDD Памет ООП Заключение След това компилираме тестовете и ги пускаме с командата $ rustc --test testing.rs $ ./ testing На екрана ще се изведе нещо такова: $ ./ testing running 1 test test this_tests_code ... ok result: ok. 1 passed; 0 failed; 0 ignored $

Slide 68

Slide 68 text

Въведение Rust? TDD Памет ООП Заключение Управление на паметта Спорно най-голямото преимущество на Rust

Slide 69

Slide 69 text

Въведение Rust? TDD Памет ООП Заключение Управление на паметта Спорно най-голямото преимущество на Rust Както и най-сложното за овладяване

Slide 70

Slide 70 text

Въведение Rust? TDD Памет ООП Заключение Управление на паметта Спорно най-голямото преимущество на Rust Както и най-сложното за овладяване Rust e garbage collected

Slide 71

Slide 71 text

Въведение Rust? TDD Памет ООП Заключение Управление на паметта Спорно най-голямото преимущество на Rust Както и най-сложното за овладяване Rust e garbage collected Aко искаме да е

Slide 72

Slide 72 text

Въведение Rust? TDD Памет ООП Заключение Инструменти за управление на паметта Три вида указатели

Slide 73

Slide 73 text

Въведение Rust? TDD Памет ООП Заключение Инструменти за управление на паметта Три вида указатели Управлявани кутии (Managed boxes): let x = @10;

Slide 74

Slide 74 text

Въведение Rust? TDD Памет ООП Заключение Инструменти за управление на паметта Три вида указатели Управлявани кутии (Managed boxes): let x = @10; Собствени кутии (Owned boxes): let x = ∼ 10;

Slide 75

Slide 75 text

Въведение Rust? TDD Памет ООП Заключение Инструменти за управление на паметта Три вида указатели Управлявани кутии (Managed boxes): let x = @10; Собствени кутии (Owned boxes): let x = ∼ 10; Указатели на заем (Borrowed pointers): Означават се с &

Slide 76

Slide 76 text

Въведение Rust? TDD Памет ООП Заключение Инструменти за управление на паметта Три вида указатели Управлявани кутии (Managed boxes): let x = @10; Собствени кутии (Owned boxes): let x = ∼ 10; Указатели на заем (Borrowed pointers): Означават се с & Небезопасни блокове и функции

Slide 77

Slide 77 text

Въведение Rust? TDD Памет ООП Заключение Структури

Slide 78

Slide 78 text

Въведение Rust? TDD Памет ООП Заключение Структури Структурите се използват за ” пакетиране“ на стойности:

Slide 79

Slide 79 text

Въведение Rust? TDD Памет ООП Заключение Структури Структурите се използват за ” пакетиране“ на стойности: Структура struct Monster { health: int , attack: int } fn main () { let m = Monster { health: 10, attack: 20 }; println(int:: to_str(m.health )); println(int:: to_str(m.attack )); }

Slide 80

Slide 80 text

Въведение Rust? TDD Памет ООП Заключение Когато компилираме и изпълним предния код, на екранът ще се изведе: $ rust run dwemthysarray.rs 10 20 $

Slide 81

Slide 81 text

Въведение Rust? TDD Памет ООП Заключение Когато компилираме и изпълним предния код, на екранът ще се изведе: $ rust run dwemthysarray.rs 10 20 $ Ако пък подадем структурата на fmt!, използвайки формата %?:

Slide 82

Slide 82 text

Въведение Rust? TDD Памет ООП Заключение Когато компилираме и изпълним предния код, на екранът ще се изведе: $ rust run dwemthysarray.rs 10 20 $ Ако пък подадем структурата на fmt!, използвайки формата %?: $ rust run dwemthysarray.rs {health: 10, attack: 20} $

Slide 83

Slide 83 text

Въведение Rust? TDD Памет ООП Заключение Когато компилираме и изпълним предния код, на екранът ще се изведе: $ rust run dwemthysarray.rs 10 20 $ Ако пък подадем структурата на fmt!, използвайки формата %?: $ rust run dwemthysarray.rs {health: 10, attack: 20} $ Яко!

Slide 84

Slide 84 text

Въведение Rust? TDD Памет ООП Заключение Методи Методите, са функции, които приемат първи аргумент с име self.

Slide 85

Slide 85 text

Въведение Rust? TDD Памет ООП Заключение Методи Методите, са функции, които приемат първи аргумент с име self. Python anyone?

Slide 86

Slide 86 text

Въведение Rust? TDD Памет ООП Заключение Методи Методите, са функции, които приемат първи аргумент с име self. Python anyone? Имплементация на метод struct Monster { h e a l t h : int , a t t a c k : int } impl Monster { fn a t t a c k (& s e l f ) { p r i n t l n ( fmt ! ( " The ␣ m o n s t e r ␣ a t t a c k s ␣ for ␣ % d ␣ damage . " , s e l f . a t t a c k ) ) ; } } fn main ( ) { l e t m = Monster { h e a l t h : 10 , a t t a c k : 20 } ; m. a t t a c k ( ) ; }

Slide 87

Slide 87 text

Въведение Rust? TDD Памет ООП Заключение Методи Това ще ни върне $ rust run dwemthysarray.rs The monster attacks for 20 damage. $

Slide 88

Slide 88 text

Въведение Rust? TDD Памет ООП Заключение Асоциирани функции

Slide 89

Slide 89 text

Въведение Rust? TDD Памет ООП Заключение Асоциирани функции Аналог на класовите методи в Ruby и статичните методи в Ява.

Slide 90

Slide 90 text

Въведение Rust? TDD Памет ООП Заключение Асоциирани функции Аналог на класовите методи в Ruby и статичните методи в Ява. Дефинираме ги като метод, само че без self за първи аргумент.

Slide 91

Slide 91 text

Въведение Rust? TDD Памет ООП Заключение Асоциирани функции Аналог на класовите методи в Ruby и статичните методи в Ява. Дефинираме ги като метод, само че без self за първи аргумент.

Slide 92

Slide 92 text

Въведение Rust? TDD Памет ООП Заключение Асоциирани функции Аналог на класовите методи в Ruby и статичните методи в Ява. Дефинираме ги като метод, само че без self за първи аргумент. Асоциирана функция impl Monster { fn count () { println("There␣are␣lots␣of␣monsters."); } }

Slide 93

Slide 93 text

Въведение Rust? TDD Памет ООП Заключение Асоциирани функции

Slide 94

Slide 94 text

Въведение Rust? TDD Памет ООП Заключение Асоциирани функции Асоциираните функции намират приложение при имплементирането на конструктор в Rust.

Slide 95

Slide 95 text

Въведение Rust? TDD Памет ООП Заключение Асоциирани функции Асоциираните функции намират приложение при имплементирането на конструктор в Rust. Конструктор struct Monster { h e a l t h : int , a t t a c k : int } impl Monster { fn a t t a c k (& s e l f ) { p r i n t l n ( fmt ! ( " The ␣ m o n s t e r ␣ a t t a c k s ␣ for ␣ % d ␣ damage . " , s e l f . a t t a c k ) ) ; } fn new ( h e a l t h : int , a t t a c k : int ) −> Monster { Monster { h e a l t h : h e a l t h , a t t a c k : a t t a c k } } } fn main ( ) { Monster : : new (20 , 4 0 ) . a t t a c k ( ) ; }

Slide 96

Slide 96 text

Въведение Rust? TDD Памет ООП Заключение Типажи и обобщения (Traits & Generics) Нещо средно между миксин и интерфейс.

Slide 97

Slide 97 text

Въведение Rust? TDD Памет ООП Заключение Типажи и обобщения (Traits & Generics) Нещо средно между миксин и интерфейс. Абстрактен клас?

Slide 98

Slide 98 text

Въведение Rust? TDD Памет ООП Заключение Типажи и обобщения (Traits & Generics) Нещо средно между миксин и интерфейс. Абстрактен клас? Чрез тях се постига полиморфизъм в Rust

Slide 99

Slide 99 text

Въведение Rust? TDD Памет ООП Заключение Лирическо отклонение Аналогът на списъците в Ruby в Rust са векторите. Не са хетерогенни като в Ruby

Slide 100

Slide 100 text

Въведение Rust? TDD Памет ООП Заключение Лирическо отклонение Аналогът на списъците в Ruby в Rust са векторите. Не са хетерогенни като в Ruby Immutable по подразбиране като всичко останало

Slide 101

Slide 101 text

Въведение Rust? TDD Памет ООП Заключение Лирическо отклонение Аналогът на списъците в Ruby в Rust са векторите. Не са хетерогенни като в Ruby Immutable по подразбиране като всичко останало Дефинирани са им алгебрични оператори като в Ruby

Slide 102

Slide 102 text

Въведение Rust? TDD Памет ООП Заключение Лирическо отклонение Аналогът на списъците в Ruby в Rust са векторите. Не са хетерогенни като в Ruby Immutable по подразбиране като всичко останало Дефинирани са им алгебрични оператори като в Ruby

Slide 103

Slide 103 text

Въведение Rust? TDD Памет ООП Заключение Лирическо отклонение Аналогът на списъците в Ruby в Rust са векторите. Не са хетерогенни като в Ruby Immutable по подразбиране като всичко останало Дефинирани са им алгебрични оператори като в Ruby Вектори fn main () { l e t your_numbers = @[ 1 , 2 , 3 ] ; l e t my_numbers = @[ 4 , 5 , 6 ] ; l e t our_numbers = your_numbers + my_numbers ; p r i n t l n ( fmt ! ( "The␣third␣number␣is␣%d." , our_numbers [ 2 ] ) ) }

Slide 104

Slide 104 text

Въведение Rust? TDD Памет ООП Заключение Trait fn print_vec (v: &[T]) { for v.each |&i| { println(i.to_str ()) } } fn main () { let vec = [1 ,2 ,3]; print_vec(vec); let str_vec = [~"hey", ~"there", ~"yo"]; print_vec(str_vec ); }

Slide 105

Slide 105 text

Въведение Rust? TDD Памет ООП Заключение Operator Overloading Едно време ми се наложи да рисувам ето тази красота:

Slide 106

Slide 106 text

Въведение Rust? TDD Памет ООП Заключение Operator Overloading Едно време ми се наложи да рисувам ето тази красота:

Slide 107

Slide 107 text

Въведение Rust? TDD Памет ООП Заключение Operator Overloading Едно време ми се наложи да рисувам ето тази красота: Нарича се ” Аполониева гарнитура“ и е фрактал.

Slide 108

Slide 108 text

Въведение Rust? TDD Памет ООП Заключение Сега няма да се плашите.

Slide 109

Slide 109 text

Въведение Rust? TDD Памет ООП Заключение Сега няма да се плашите. Центровете и радиусите на окръжностите се изчисляват с теоремата на Декарт.

Slide 110

Slide 110 text

Въведение Rust? TDD Памет ООП Заключение Сега няма да се плашите. Центровете и радиусите на окръжностите се изчисляват с теоремата на Декарт. Нека центъра на окръжност zj е комплексно число (т.е. zj = xj + i yj ).

Slide 111

Slide 111 text

Въведение Rust? TDD Памет ООП Заключение Сега няма да се плашите. Центровете и радиусите на окръжностите се изчисляват с теоремата на Декарт. Нека центъра на окръжност zj е комплексно число (т.е. zj = xj + i yj ). Нека кривата kj е реципрочното число на дължината на радиуса на окръжността.

Slide 112

Slide 112 text

Въведение Rust? TDD Памет ООП Заключение Сега няма да се плашите. Центровете и радиусите на окръжностите се изчисляват с теоремата на Декарт. Нека центъра на окръжност zj е комплексно число (т.е. zj = xj + i yj ). Нека кривата kj е реципрочното число на дължината на радиуса на окръжността.

Slide 113

Slide 113 text

Въведение Rust? TDD Памет ООП Заключение Сега няма да се плашите. Центровете и радиусите на окръжностите се изчисляват с теоремата на Декарт. Нека центъра на окръжност zj е комплексно число (т.е. zj = xj + i yj ). Нека кривата kj е реципрочното число на дължината на радиуса на окръжността. Тогава центъра на допираща се до четири други окръжности окръжност намираме така: Следствие от комплексната декартова теорема z4 = 2(zmkm + z2k2 + z3k3) − z1k1 k4

Slide 114

Slide 114 text

Въведение Rust? TDD Памет ООП Заключение Фракталите с окръжности са ГАДНИ.

Slide 115

Slide 115 text

Въведение Rust? TDD Памет ООП Заключение Фракталите с окръжности са ГАДНИ. Сериозно.

Slide 116

Slide 116 text

Въведение Rust? TDD Памет ООП Заключение Бях млад и глупав и реших да имплементирам предната формула на Java.

Slide 117

Slide 117 text

Въведение Rust? TDD Памет ООП Заключение Бях млад и глупав и реших да имплементирам предната формула на Java. Сега вече не съм толкова млад.

Slide 118

Slide 118 text

Въведение Rust? TDD Памет ООП Заключение Бях млад и глупав и реших да имплементирам предната формула на Java. Сега вече не съм толкова млад. Ето какво се получи:

Slide 119

Slide 119 text

Въведение Rust? TDD Памет ООП Заключение Бях млад и глупав и реших да имплементирам предната формула на Java. Сега вече не съм толкова млад. Ето какво се получи: Java public static Complex getDaughterCenter ( S o d d y C i r c l e m, S o d d y C i r c l e a1 , S o d d y C i r c l e a2 , S o d d y C i r c l e a3 , double k ){ Complex z = m. z ( ) . m u l t i p l y (m. k ) . add ( a2 . z ( ) . m u l t i p l y ( a2 . k ) ) . add ( a3 . z ( ) . m u l t i p l y ( a3 . k ) ) . m u l t i p l y ( 2 ) . s u b t r a c t ( a1 . z ( ) . m u l t i p l y ( a1 . k ) ) . d i v i d e ( new Complex ( k , 0 ) ) ; return z ; }

Slide 120

Slide 120 text

Въведение Rust? TDD Памет ООП Заключение Бях млад и глупав и реших да имплементирам предната формула на Java. Сега вече не съм толкова млад. Ето какво се получи: Java public static Complex getDaughterCenter ( S o d d y C i r c l e m, S o d d y C i r c l e a1 , S o d d y C i r c l e a2 , S o d d y C i r c l e a3 , double k ){ Complex z = m. z ( ) . m u l t i p l y (m. k ) . add ( a2 . z ( ) . m u l t i p l y ( a2 . k ) ) . add ( a3 . z ( ) . m u l t i p l y ( a3 . k ) ) . m u l t i p l y ( 2 ) . s u b t r a c t ( a1 . z ( ) . m u l t i p l y ( a1 . k ) ) . d i v i d e ( new Complex ( k , 0 ) ) ; return z ; } Приоритетът на операциите е пълна боза.

Slide 121

Slide 121 text

Въведение Rust? TDD Памет ООП Заключение Бях млад и глупав и реших да имплементирам предната формула на Java. Сега вече не съм толкова млад. Ето какво се получи: Java public static Complex getDaughterCenter ( S o d d y C i r c l e m, S o d d y C i r c l e a1 , S o d d y C i r c l e a2 , S o d d y C i r c l e a3 , double k ){ Complex z = m. z ( ) . m u l t i p l y (m. k ) . add ( a2 . z ( ) . m u l t i p l y ( a2 . k ) ) . add ( a3 . z ( ) . m u l t i p l y ( a3 . k ) ) . m u l t i p l y ( 2 ) . s u b t r a c t ( a1 . z ( ) . m u l t i p l y ( a1 . k ) ) . d i v i d e ( new Complex ( k , 0 ) ) ; return z ; } Приоритетът на операциите е пълна боза. Освен това... .add(), .multipy(), .divide()...

Slide 122

Slide 122 text

Въведение Rust? TDD Памет ООП Заключение

Slide 123

Slide 123 text

Въведение Rust? TDD Памет ООП Заключение Ето как може да стане на Rust:

Slide 124

Slide 124 text

Въведение Rust? TDD Памет ООП Заключение Ето как може да стане на Rust: Rust fn get_daughter_center (m: C i r c l e , a1 : C i r c l e , a2 : C i r c l e , a3 : C i r c l e , k : float ) −> Cmplx { l e t ( p , q ) = (~Cmplx : : new ( 2 . 0 , 0 . 0 ) , ~Cmplx : : new ( k , 0 . 0 ) ) ; ( (m. z ∗ m. k + a2 . z ∗ a2 . k + a3 . z ∗ a3 . k ) ∗ ∗p − a1 . z ∗ a1 . k ) / ∗q }

Slide 125

Slide 125 text

Въведение Rust? TDD Памет ООП Заключение Ето как може да стане на Rust: Rust fn get_daughter_center (m: C i r c l e , a1 : C i r c l e , a2 : C i r c l e , a3 : C i r c l e , k : float ) −> Cmplx { l e t ( p , q ) = (~Cmplx : : new ( 2 . 0 , 0 . 0 ) , ~Cmplx : : new ( k , 0 . 0 ) ) ; ( (m. z ∗ m. k + a2 . z ∗ a2 . k + a3 . z ∗ a3 . k ) ∗ ∗p − a1 . z ∗ a1 . k ) / ∗q } Пак е рунтаво, но е далеч по-четимо и по-лесно за дебъг от предишното.

Slide 126

Slide 126 text

Въведение Rust? TDD Памет ООП Заключение Заключение

Slide 127

Slide 127 text

Въведение Rust? TDD Памет ООП Заключение БЛАГОДАРЯ!