Въведение Rust? TDD Памет ООП Заключение
Rust
за практичния програмист
Петко Борджуков
PlovdivConf
6 юли 2013 г.
Въведение Rust? TDD Памет ООП Заключение
За лектора
Петко
Въведение Rust? TDD Памет ООП Заключение
За лектора
Петко
занимава се с Ruby и Rails
Въведение Rust? TDD Памет ООП Заключение
За лектора
Петко
занимава се с Ruby и Rails
Въведение Rust? TDD Памет ООП Заключение
За лектора
Петко
занимава се с Ruby и Rails
@ignisf
Въведение Rust? TDD Памет ООП Заключение
За лектора
Петко
занимава се с Ruby и Rails
@ignisf
http://gplus.to/ignisf
Въведение Rust? TDD Памет ООП Заключение
За лектора
Петко
занимава се с Ruby и Rails
@ignisf
http://gplus.to/ignisf
https://github.com/ignisf
Въведение Rust? TDD Памет ООП Заключение
Кратката история на Rust
Въведение Rust? TDD Памет ООП Заключение
Кратката история на Rust
Започнат през 2006 г. като личен проект на Грейдън
Хауър, служител на Mozilla
Въведение Rust? TDD Памет ООП Заключение
Кратката история на Rust
Започнат през 2006 г. като личен проект на Грейдън
Хауър, служител на Mozilla
Mozilla се включва през 2009 г.
Въведение Rust? TDD Памет ООП Заключение
Кратката история на Rust
Започнат през 2006 г. като личен проект на Грейдън
Хауър, служител на Mozilla
Mozilla се включва през 2009 г.
Първа алфа на компилатора през януари 2012 г.
Въведение Rust? TDD Памет ООП Заключение
Кратката история на Rust
Започнат през 2006 г. като личен проект на Грейдън
Хауър, служител на Mozilla
Mozilla се включва през 2009 г.
Първа алфа на компилатора през януари 2012 г.
Версия 0.7 – преди няколко дни
Въведение Rust? TDD Памет ООП Заключение
Кратката история на Rust
Започнат през 2006 г. като личен проект на Грейдън
Хауър, служител на Mozilla
Mozilla се включва през 2009 г.
Първа алфа на компилатора през януари 2012 г.
Версия 0.7 – преди няколко дни
Стабилна версия – до края на годината
Въведение Rust? TDD Памет ООП Заключение
Парадигми
Въведение Rust? TDD Памет ООП Заключение
Парадигми
Компилируем
Въведение Rust? TDD Памет ООП Заключение
Парадигми
Компилируем
Функционален (горе-долу)
Въведение Rust? TDD Памет ООП Заключение
Парадигми
Компилируем
Функционален (горе-долу)
Конкурентен (по модела на актьорите)
Въведение Rust? TDD Памет ООП Заключение
Парадигми
Компилируем
Функционален (горе-долу)
Конкурентен (по модела на актьорите)
Императивно-процедурен
Въведение Rust? TDD Памет ООП Заключение
Парадигми
Компилируем
Функционален (горе-долу)
Конкурентен (по модела на актьорите)
Императивно-процедурен
Обектно ориентиран
Въведение Rust? TDD Памет ООП Заключение
Фокус върху
Въведение Rust? TDD Памет ООП Заключение
Фокус върху
Type safety
Въведение Rust? TDD Памет ООП Заключение
Фокус върху
Type safety
Memory safety
Въведение Rust? TDD Памет ООП Заключение
Фокус върху
Type safety
Memory safety
Concurrency
Въведение Rust? TDD Памет ООП Заключение
Фокус върху
Type safety
Memory safety
Concurrency
Performance
Въведение Rust? TDD Памет ООП Заключение
Практична функционалност от по-високо ниво
Въведение Rust? TDD Памет ООП Заключение
Практична функционалност от по-високо ниво
Type inferrence
Въведение Rust? TDD Памет ООП Заключение
Практична функционалност от по-високо ниво
Type inferrence
Safe task-based concurrency
Въведение Rust? TDD Памет ООП Заключение
Практична функционалност от по-високо ниво
Type inferrence
Safe task-based concurrency
Функции от по-висок ред
Въведение Rust? TDD Памет ООП Заключение
Практична функционалност от по-високо ниво
Type inferrence
Safe task-based concurrency
Функции от по-висок ред
Полиморфизъм
Въведение Rust? TDD Памет ООП Заключение
Защо да се интересуваме от Rust?
Какво е кофти в Ruby?
Въведение Rust? TDD Памет ООП Заключение
Защо да се интересуваме от Rust?
Какво е кофти в Ruby?
Конкурентността
Въведение Rust? TDD Памет ООП Заключение
Защо да се интересуваме от Rust?
Какво е кофти в Ruby?
Конкурентността
Конкурентността!!1
Въведение Rust? TDD Памет ООП Заключение
Защо да се интересуваме от Rust?
Какво е кофти в Ruby?
Конкурентността
Конкурентността!!1
Гаранциите за сигурност
Въведение Rust? TDD Памет ООП Заключение
Защо да се интересуваме от Rust?
Какво е кофти в Ruby?
Конкурентността
Конкурентността!!1
Гаранциите за сигурност
Много променливи състояния
Въведение Rust? TDD Памет ООП Заключение
Защо да се интересуваме от Rust?
Какво е кофти в Ruby?
Конкурентността
Конкурентността!!1
Гаранциите за сигурност
Много променливи състояния
Бавен е
Въведение Rust? TDD Памет ООП Заключение
Защо да се интересуваме от Rust?
Какво е кофти в Ruby?
Конкурентността
Конкурентността!!1
Гаранциите за сигурност
Много променливи състояния
Бавен е
Сложен е (семантиката на Smalltalk се събира на листче)
Въведение Rust? TDD Памет ООП Заключение
Защо да се интересуваме от Rust?
Какво е яко в Ruby?
Въведение Rust? TDD Памет ООП Заключение
Защо да се интересуваме от Rust?
Какво е яко в Ruby?
Блоковете
Въведение Rust? TDD Памет ООП Заключение
Защо да се интересуваме от Rust?
Какво е яко в Ruby?
Блоковете
Тове, че е функционален
Въведение Rust? TDD Памет ООП Заключение
Защо да се интересуваме от Rust?
Какво е яко в Ruby?
Блоковете
Тове, че е функционален
Синтаксисът е горе-долу лесен
Въведение Rust? TDD Памет ООП Заключение
Защо да се интересуваме от Rust?
Какво е яко в Ruby?
Блоковете
Тове, че е функционален
Синтаксисът е горе-долу лесен
Прави разработчиците щастливи.
Въведение Rust? TDD Памет ООП Заключение
Защо да се интересуваме от Rust?
Какво е яко в Ruby?
Блоковете
Тове, че е функционален
Синтаксисът е горе-долу лесен
Прави разработчиците щастливи.
Програмира се бързо с него
Въведение Rust? TDD Памет ООП Заключение
Защо да се интересуваме от Rust?
Какво е яко в Ruby?
Блоковете
Тове, че е функционален
Синтаксисът е горе-долу лесен
Прави разработчиците щастливи.
Програмира се бързо с него
Динамично типизиран е
Въведение Rust? TDD Памет ООП Заключение
Популярният пример
Въведение Rust? TDD Памет ООП Заключение
Популярният пример
Hello World
fn main () {
println("hello?");
}
Въведение Rust? TDD Памет ООП Заключение
Популярният пример
Hello World
fn main () {
println("hello?");
}
Прилича ли ви на нещо познато?
Въведение Rust? TDD Памет ООП Заключение
Още познати неща
Въведение 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 ) ;
}
}
}
Въведение 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
Въведение Rust? TDD Памет ООП Заключение
Приличия между Ruby и Rust
Променливите са в snake_case
Въведение Rust? TDD Памет ООП Заключение
Приличия между Ruby и Rust
Променливите са в snake_case
Имаме блокове, които използват {}
Въведение Rust? TDD Памет ООП Заключение
Приличия между Ruby и Rust
Променливите са в snake_case
Имаме блокове, които използват {}
Въпреки че промеливите са статични типизирани, имаме
type inferrence, така че няма нужда да декларираме типове
Въведение Rust? TDD Памет ООП Заключение
Приличия между Ruby и Rust
Променливите са в snake_case
Имаме блокове, които използват {}
Въпреки че промеливите са статични типизирани, имаме
type inferrence, така че няма нужда да декларираме типове
Ще видим още прилики по-нататък
Въведение Rust? TDD Памет ООП Заключение
Различия между Ruby и Rust
; (почти) навсякъде
Въведение Rust? TDD Памет ООП Заключение
Различия между Ruby и Rust
; (почти) навсякъде
Нямаме блокове, които използват do и end
Въведение Rust? TDD Памет ООП Заключение
Различия между Ruby и Rust
; (почти) навсякъде
Нямаме блокове, които използват do и end
Малко по-различен синтаксис за дефиниране на функция:
fn вместо def
Въведение Rust? TDD Памет ООП Заключение
Различия между Ruby и Rust
; (почти) навсякъде
Нямаме блокове, които използват do и end
Малко по-различен синтаксис за дефиниране на функция:
fn вместо def
Понеже нямаме do и end, използваме {} навсякъде
Въведение Rust? TDD Памет ООП Заключение
Различия между Ruby и Rust
; (почти) навсякъде
Нямаме блокове, които използват do и end
Малко по-различен синтаксис за дефиниране на функция:
fn вместо def
Понеже нямаме do и end, използваме {} навсякъде
Компилаторът ни се кара повече, ако сгрешим
Въведение Rust? TDD Памет ООП Заключение
Различия между Ruby и Rust
; (почти) навсякъде
Нямаме блокове, които използват do и end
Малко по-различен синтаксис за дефиниране на функция:
fn вместо def
Понеже нямаме do и end, използваме {} навсякъде
Компилаторът ни се кара повече, ако сгрешим
При писане на Rust трябва да се следва PEP8 Style Guide
Въведение Rust? TDD Памет ООП Заключение
Различия между Ruby и Rust
; (почти) навсякъде
Нямаме блокове, които използват do и end
Малко по-различен синтаксис за дефиниране на функция:
fn вместо def
Понеже нямаме do и end, използваме {} навсякъде
Компилаторът ни се кара повече, ако сгрешим
При писане на Rust трябва да се следва PEP8 Style Guide
ВСИЧКО е immutable по подразбиране.
Въведение Rust? TDD Памет ООП Заключение
Различия между Ruby и Rust
; (почти) навсякъде
Нямаме блокове, които използват do и end
Малко по-различен синтаксис за дефиниране на функция:
fn вместо def
Понеже нямаме do и end, използваме {} навсякъде
Компилаторът ни се кара повече, ако сгрешим
При писане на Rust трябва да се следва PEP8 Style Guide
ВСИЧКО е immutable по подразбиране.
Въведение Rust? TDD Памет ООП Заключение
Различия между Ruby и Rust
; (почти) навсякъде
Нямаме блокове, които използват do и end
Малко по-различен синтаксис за дефиниране на функция:
fn вместо def
Понеже нямаме do и end, използваме {} навсякъде
Компилаторът ни се кара повече, ако сгрешим
При писане на Rust трябва да се следва PEP8 Style Guide
ВСИЧКО е immutable по подразбиране. Да, дори
променливите
Въведение Rust? TDD Памет ООП Заключение
Фреймуърк за тестване
В Rust има вграден прост фреймуърк за писане на unit тестове.
Въведение Rust? TDD Памет ООП Заключение
Фреймуърк за тестване
В Rust има вграден прост фреймуърк за писане на unit тестове.
Не е RSpec, но хайде да не бъдем претенциозни...
Въведение Rust? TDD Памет ООП Заключение
Фреймуърк за тестване
В Rust има вграден прост фреймуърк за писане на unit тестове.
Не е RSpec, но хайде да не бъдем претенциозни...
testing.rs
#[test]
fn this_tests_code () {
println("")
}
Въведение Rust? TDD Памет ООП Заключение
След това компилираме тестовете и ги пускаме с командата
$ rustc --test testing.rs
$ ./ testing
Въведение Rust? TDD Памет ООП Заключение
След това компилираме тестовете и ги пускаме с командата
$ rustc --test testing.rs
$ ./ testing
На екрана ще се изведе нещо такова:
$ ./ testing
running 1 test
test this_tests_code ... ok
result: ok. 1 passed; 0 failed; 0 ignored
$
Въведение Rust? TDD Памет ООП Заключение
Управление на паметта
Спорно най-голямото преимущество на Rust
Въведение Rust? TDD Памет ООП Заключение
Управление на паметта
Спорно най-голямото преимущество на Rust
Както и най-сложното за овладяване
Въведение Rust? TDD Памет ООП Заключение
Управление на паметта
Спорно най-голямото преимущество на Rust
Както и най-сложното за овладяване
Rust e garbage collected
Въведение Rust? TDD Памет ООП Заключение
Управление на паметта
Спорно най-голямото преимущество на Rust
Както и най-сложното за овладяване
Rust e garbage collected
Aко искаме да е
Въведение Rust? TDD Памет ООП Заключение
Инструменти за управление на паметта
Три вида указатели
Въведение Rust? TDD Памет ООП Заключение
Инструменти за управление на паметта
Три вида указатели
Управлявани кутии (Managed boxes): let x = @10;
Въведение Rust? TDD Памет ООП Заключение
Инструменти за управление на паметта
Три вида указатели
Управлявани кутии (Managed boxes): let x = @10;
Собствени кутии (Owned boxes): let x = ∼ 10;
Въведение Rust? TDD Памет ООП Заключение
Инструменти за управление на паметта
Три вида указатели
Управлявани кутии (Managed boxes): let x = @10;
Собствени кутии (Owned boxes): let x = ∼ 10;
Указатели на заем (Borrowed pointers): Означават се с &
Въведение Rust? TDD Памет ООП Заключение
Инструменти за управление на паметта
Три вида указатели
Управлявани кутии (Managed boxes): let x = @10;
Собствени кутии (Owned boxes): let x = ∼ 10;
Указатели на заем (Borrowed pointers): Означават се с &
Небезопасни блокове и функции
Въведение Rust? TDD Памет ООП Заключение
Структури
Въведение Rust? TDD Памет ООП Заключение
Структури
Структурите се използват за
”
пакетиране“ на стойности:
Въведение 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 ));
}
Въведение Rust? TDD Памет ООП Заключение
Когато компилираме и изпълним предния код, на екранът ще
се изведе:
$ rust run dwemthysarray.rs
10
20
$
Въведение Rust? TDD Памет ООП Заключение
Когато компилираме и изпълним предния код, на екранът ще
се изведе:
$ rust run dwemthysarray.rs
10
20
$
Ако пък подадем структурата на fmt!, използвайки формата
%?:
Въведение Rust? TDD Памет ООП Заключение
Когато компилираме и изпълним предния код, на екранът ще
се изведе:
$ rust run dwemthysarray.rs
10
20
$
Ако пък подадем структурата на fmt!, използвайки формата
%?:
$ rust run dwemthysarray.rs
{health: 10, attack: 20}
$
Въведение Rust? TDD Памет ООП Заключение
Когато компилираме и изпълним предния код, на екранът ще
се изведе:
$ rust run dwemthysarray.rs
10
20
$
Ако пък подадем структурата на fmt!, използвайки формата
%?:
$ rust run dwemthysarray.rs
{health: 10, attack: 20}
$
Яко!
Въведение Rust? TDD Памет ООП Заключение
Методи
Методите, са функции, които приемат първи аргумент с име
self.
Въведение Rust? TDD Памет ООП Заключение
Методи
Методите, са функции, които приемат първи аргумент с име
self. Python anyone?
Въведение 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 ( ) ;
}
Въведение Rust? TDD Памет ООП Заключение
Методи
Това ще ни върне
$ rust run dwemthysarray.rs
The monster attacks for 20 damage.
$
Въведение Rust? TDD Памет ООП Заключение
Асоциирани функции
Въведение Rust? TDD Памет ООП Заключение
Асоциирани функции
Аналог на класовите методи в Ruby и статичните методи в
Ява.
Въведение Rust? TDD Памет ООП Заключение
Асоциирани функции
Аналог на класовите методи в Ruby и статичните методи в
Ява.
Дефинираме ги като метод, само че без self за първи
аргумент.
Въведение Rust? TDD Памет ООП Заключение
Асоциирани функции
Аналог на класовите методи в Ruby и статичните методи в
Ява.
Дефинираме ги като метод, само че без self за първи
аргумент.
Въведение Rust? TDD Памет ООП Заключение
Асоциирани функции
Аналог на класовите методи в Ruby и статичните методи в
Ява.
Дефинираме ги като метод, само че без self за първи
аргумент.
Асоциирана функция
impl Monster {
fn count () {
println("There␣are␣lots␣of␣monsters.");
}
}
Въведение Rust? TDD Памет ООП Заключение
Асоциирани функции
Въведение Rust? TDD Памет ООП Заключение
Асоциирани функции
Асоциираните функции намират приложение при
имплементирането на конструктор в Rust.
Въведение 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 ( ) ;
}
Въведение Rust? TDD Памет ООП Заключение
Типажи и обобщения (Traits & Generics)
Нещо средно между миксин и интерфейс.
Въведение Rust? TDD Памет ООП Заключение
Типажи и обобщения (Traits & Generics)
Нещо средно между миксин и интерфейс. Абстрактен
клас?
Въведение Rust? TDD Памет ООП Заключение
Типажи и обобщения (Traits & Generics)
Нещо средно между миксин и интерфейс. Абстрактен
клас?
Чрез тях се постига полиморфизъм в Rust
Въведение Rust? TDD Памет ООП Заключение
Лирическо отклонение
Аналогът на списъците в Ruby в Rust са векторите.
Не са хетерогенни като в Ruby
Въведение Rust? TDD Памет ООП Заключение
Лирическо отклонение
Аналогът на списъците в Ruby в Rust са векторите.
Не са хетерогенни като в Ruby
Immutable по подразбиране като всичко останало
Въведение Rust? TDD Памет ООП Заключение
Лирическо отклонение
Аналогът на списъците в Ruby в Rust са векторите.
Не са хетерогенни като в Ruby
Immutable по подразбиране като всичко останало
Дефинирани са им алгебрични оператори като в Ruby
Въведение Rust? TDD Памет ООП Заключение
Лирическо отклонение
Аналогът на списъците в Ruby в Rust са векторите.
Не са хетерогенни като в Ruby
Immutable по подразбиране като всичко останало
Дефинирани са им алгебрични оператори като в Ruby
Въведение 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 ] ) )
}
Въведение 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 );
}
Въведение Rust? TDD Памет ООП Заключение
Operator Overloading
Едно време ми се наложи да рисувам ето тази красота:
Въведение Rust? TDD Памет ООП Заключение
Operator Overloading
Едно време ми се наложи да рисувам ето тази красота:
Въведение Rust? TDD Памет ООП Заключение
Operator Overloading
Едно време ми се наложи да рисувам ето тази красота:
Нарича се
”
Аполониева гарнитура“ и е фрактал.
Въведение Rust? TDD Памет ООП Заключение
Сега няма да се плашите.
Въведение Rust? TDD Памет ООП Заключение
Сега няма да се плашите.
Центровете и радиусите на окръжностите се изчисляват с
теоремата на Декарт.
Въведение Rust? TDD Памет ООП Заключение
Сега няма да се плашите.
Центровете и радиусите на окръжностите се изчисляват с
теоремата на Декарт.
Нека центъра на окръжност zj е комплексно число (т.е.
zj = xj + i yj ).
Въведение Rust? TDD Памет ООП Заключение
Сега няма да се плашите.
Центровете и радиусите на окръжностите се изчисляват с
теоремата на Декарт.
Нека центъра на окръжност zj е комплексно число (т.е.
zj = xj + i yj ).
Нека кривата kj е реципрочното число на дължината на
радиуса на окръжността.
Въведение Rust? TDD Памет ООП Заключение
Сега няма да се плашите.
Центровете и радиусите на окръжностите се изчисляват с
теоремата на Декарт.
Нека центъра на окръжност zj е комплексно число (т.е.
zj = xj + i yj ).
Нека кривата kj е реципрочното число на дължината на
радиуса на окръжността.
Въведение Rust? TDD Памет ООП Заключение
Сега няма да се плашите.
Центровете и радиусите на окръжностите се изчисляват с
теоремата на Декарт.
Нека центъра на окръжност zj е комплексно число (т.е.
zj = xj + i yj ).
Нека кривата kj е реципрочното число на дължината на
радиуса на окръжността.
Тогава центъра на допираща се до четири други окръжности
окръжност намираме така:
Следствие от комплексната декартова теорема
z4 =
2(zmkm + z2k2 + z3k3) − z1k1
k4
Въведение Rust? TDD Памет ООП Заключение
Фракталите с окръжности са ГАДНИ.
Въведение Rust? TDD Памет ООП Заключение
Фракталите с окръжности са ГАДНИ.
Сериозно.
Въведение Rust? TDD Памет ООП Заключение
Бях млад и глупав и реших да имплементирам предната
формула на Java.
Въведение Rust? TDD Памет ООП Заключение
Бях млад и глупав и реших да имплементирам предната
формула на Java.
Сега вече не съм толкова млад.
Въведение Rust? TDD Памет ООП Заключение
Бях млад и глупав и реших да имплементирам предната
формула на Java.
Сега вече не съм толкова млад.
Ето какво се получи:
Въведение 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 ;
}
Въведение 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 ;
}
Приоритетът на операциите е пълна боза.
Въведение 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()...
Въведение Rust? TDD Памет ООП Заключение
Въведение Rust? TDD Памет ООП Заключение
Ето как може да стане на Rust:
Въведение 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
}
Въведение 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
}
Пак е рунтаво, но е далеч по-четимо и по-лесно за дебъг от
предишното.
Въведение Rust? TDD Памет ООП Заключение
Заключение
Въведение Rust? TDD Памет ООП Заключение
БЛАГОДАРЯ!

Rust

  • 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Памет ООП Заключение БЛАГОДАРЯ!