$30 off During Our Annual Pro Sale. View Details »

Rust за практичния програмист

Rust за практичния програмист

Накратко за Rust и основните му фийчъри. Изходен код: https://github.com/ignisf/plovdivconf-presentation-2013

Petko Bordjukov

July 06, 2013
Tweet

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  48. Въведение 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 ) ;
    }
    }
    }

    View Slide

  49. Въведение 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    пакетиране“ на стойности:

    View Slide

  79. Въведение 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 ));
    }

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  86. Въведение 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 ( ) ;
    }

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  95. Въведение 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 ( ) ;
    }

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  103. Въведение 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 ] ) )
    }

    View Slide

  104. Въведение 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 );
    }

    View Slide

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

    View Slide

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

    View Slide

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

    Аполониева гарнитура“ и е фрактал.

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  119. Въведение 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 ;
    }

    View Slide

  120. Въведение 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 ;
    }
    Приоритетът на операциите е пълна боза.

    View Slide

  121. Въведение 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()...

    View Slide

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

    View Slide

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

    View Slide

  124. Въведение 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
    }

    View Slide

  125. Въведение 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
    }
    Пак е рунтаво, но е далеч по-четимо и по-лесно за дебъг от
    предишното.

    View Slide

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

    View Slide

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

    View Slide