$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 г.
  2. Въведение Rust? TDD Памет ООП Заключение За лектора Петко

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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 ) ; } } }
  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
  50. Въведение Rust? TDD Памет ООП Заключение Приличия между Ruby и

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    и ги пускаме с командата $ rustc --test testing.rs $ ./ testing
  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 $
  68. Въведение Rust? TDD Памет ООП Заключение Управление на паметта Спорно

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

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

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

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

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

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

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

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

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

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

    за ” пакетиране“ на стойности:
  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 )); }
  80. Въведение Rust? TDD Памет ООП Заключение Когато компилираме и изпълним

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

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

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

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

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

    които приемат първи аргумент с име self. Python anyone?
  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 ( ) ; }
  87. Въведение Rust? TDD Памет ООП Заключение Методи Това ще ни

    върне $ rust run dwemthysarray.rs The monster attacks for 20 damage. $
  88. Въведение Rust? TDD Памет ООП Заключение Асоциирани функции

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

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

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

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

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

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

    намират приложение при имплементирането на конструктор в Rust.
  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 ( ) ; }
  96. Въведение Rust? TDD Памет ООП Заключение Типажи и обобщения (Traits

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

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

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

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

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

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

    списъците в Ruby в Rust са векторите. Не са хетерогенни като в Ruby Immutable по подразбиране като всичко останало Дефинирани са им алгебрични оператори като в Ruby
  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 ] ) ) }
  104. Въведение Rust? TDD Памет ООП Заключение Trait fn print_vec <T:

    ToStr >(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 ); }
  105. Въведение Rust? TDD Памет ООП Заключение Operator Overloading Едно време

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

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

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

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

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

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

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

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

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

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

    ГАДНИ. Сериозно.
  116. Въведение Rust? TDD Памет ООП Заключение Бях млад и глупав

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

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

    и реших да имплементирам предната формула на Java. Сега вече не съм толкова млад. Ето какво се получи:
  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 ; }
  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 ; } Приоритетът на операциите е пълна боза.
  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()...
  122. Въведение Rust? TDD Памет ООП Заключение

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

    стане на Rust:
  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<float> { 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 }
  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<float> { 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 } Пак е рунтаво, но е далеч по-четимо и по-лесно за дебъг от предишното.
  126. Въведение Rust? TDD Памет ООП Заключение Заключение

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