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 – преди няколко дни
Стабилна версия – до края на годината
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?
Блоковете
Тове, че е функционален
Синтаксисът е горе-долу лесен
Прави разработчиците щастливи.
Програмира се бързо с него
Динамично типизиран е
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): Означават се с &
Небезопасни блокове и функции
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.
$
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.");
}
}
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 ] ) )
}
105. Въведение Rust? TDD Памет ООП Заключение
Operator Overloading
Едно време ми се наложи да рисувам ето тази красота:
106. Въведение Rust? TDD Памет ООП Заключение
Operator Overloading
Едно време ми се наложи да рисувам ето тази красота:
107. Въведение Rust? TDD Памет ООП Заключение
Operator Overloading
Едно време ми се наложи да рисувам ето тази красота:
Нарича се
”
Аполониева гарнитура“ и е фрактал.
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
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()...
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
}
Пак е рунтаво, но е далеч по-четимо и по-лесно за дебъг от
предишното.