Rust
cargo clippy
}
Суть прикладу: Rust-програма починається з функції `main`, а виведення тексту часто виконується через макрос `println!`.; Це означає, що код не використовує стандартну бібліотеку, яка залежить від операційної системи.;== Rust і C ==
id: u32,
Some(String::from("Alice"))
Rust покращує безпеку пам’яті, але не вирішує всі security-проблеми.; * Документація Serde.; * The Rust Programming Language.; !;
== Змінні ==
impl Printable for User {
Rust і Go часто порівнюють у backend-розробці.; match read_config("config.toml") {
!; fn main() {
* роботи з raw pointers;
* FFI;
* системних API;
* низькорівневих оптимізацій;
* embedded;
* взаємодії з C;
* реалізації деяких структур даних.;<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
Приклад:
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
Див.; додатково
Приклад:
'''Порада:''' у Rust-проєкті істотно контролювати залежності, features і версії crates, особливо для production.; name = "my_app"
async fn fetch_data() -> String {
'''Clippy''' — linter для Rust.;<syntaxhighlight lang="rust">
</div>
'''Увага:''' макроси Rust потужні, але їх варто використовувати там, де вони справді спрощують код, а не приховують логіку.; Python
}
match find_user(1) {
* memory safety;
* відсутність garbage collector;
* висока продуктивність;
* сильна типізація;
* borrow checker;
* безпечніша concurrency;
* Cargo;
* хороше tooling;
* pattern matching;
* потужні enums;
* traits і generics;
* зручна обробка помилок через Result;
* придатність для системного програмування;
* WASM;
* embedded;
* FFI з C.; id: 1,
fn add_exclamation(text: &mut String) {
* use-after-free;
* double free;
* dangling pointers;
* data races;
* частини memory leaks;
* небезпечного спільного доступу до mutable data;
* багатьох помилок concurrency;
* неконтрольованого доступу до пам’яті.; '''істотно:''' lifetimes не подовжують життя об’єктів.;<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
У Rust змінні за замовчуванням immutable.;</div>
'''Borrow checker''' — це частина компілятора Rust, яка перевіряє правила borrowing.;== Threads ==
impl Rectangle {
У цьому прикладі:
* `fn main()` — точка входу в програму;
* `println!` — макрос для виведення тексту;
* `!` означає, що викликається макрос, а не звичайна функція.;== Generics ==
count = 11;
use serde::{Deserialize, Serialize};
Safe Rust запобігає багатьом помилкам:
== Приклади задач на Rust ==
Популярні web frameworks:
</div>
Rust підтримує роботу потоки через стандартну бібліотеку.; '''Практична роль:''' rustfmt сприяє команді писати код в одному стилі без ручного форматування.; * web apps;
* high-performance browser logic;
* plugins;
* sandboxed execution;
* cross-platform modules;
* edge computing;
* game logic;
* cryptography in browser.; '''Критично:''' FFI часто потребує `unsafe`, з цієї причини межі між Rust і C потрібно ретельно перевіряти.;
tokio = { version = "1", features = ["full"] }
Хороші практики Rust
- використовувати `cargo fmt`;
- запускати `cargo clippy`;
- писати tests;
- обмежувати `unsafe`;
- документувати unsafe-блоки;
- використовувати `Result` для помилок;
- не зловживати `unwrap` у production;
- уникати зайвих `clone`;
- починати із простих типів;
- використовувати traits для абстракцій;
- контролювати dependencies;
- регулярно оновлювати crates;
- додавати CI;
- перевіряти panic paths;
- писати зрозумілі error messages.; Популярні crates:
Приклад: } Після `let b = a;` власником рядка стає `b`, а `a` більше не можна використовувати.; Rust має змогу бути не найкращим вибором для:
Cargo.toml — це конфігураційний файл Rust-проєкту.; Але воно покладає частину відповідальності за безпеку на програміста.; Коли власник виходить з області видимості, значення автономно звільняється.;=== Читання файлу ===
id: u32,
fn print(&self) {
Запуск:
name: String::from("Alice"),
rustc
let user = User {
FFI і взаємодія з C
Move { x: i32, y: i32 },
Головна думка: Rust — це мова для продуктивного й надійного програмування, де компілятор сприяє знаходити помилки пам’яті та concurrency ще до запуску програми.;
for handle in handles {
- назву пакета;
- версію;
- edition;
- dependencies;
- dev-dependencies;
- build settings;
- features;
- metadata.; * Cargo Book.;
let text = String::from("hello");
Rust має два режими:
fn main() {
У Rust останній вираз без крапки з комою має змогу бути значенням, що повертається.;</syntaxhighlight> use std::io;
}
Оператор ?
</syntaxhighlight>
`&message` — це immutable reference.; println!("{}", self.name);
Error handling
істотно: Rust не є собою “простішою заміною C”.; }
Приклади:
}
}
- швидкий запуск;
- один binary;
- хороша продуктивність;
- зручний Cargo;
- кросплатформеність;
- бібліотеки для аргументів, конфігурації й терміналу.; struct User {
Safe Rust і Unsafe Rust
cargo fmt
}
serde = "1"
struct надає можливість створювати власні типи даних.;</syntaxhighlight> extern "C" {
New, None
} else {
Можливі складнощі:
== Modules ==
'''Практична роль:''' Rust + WebAssembly надає можливість переносити продуктивний код у браузер або sandboxed environment.;
}
Err(error) => eprintln!("Error: {}", error),
Status::Blocked => println!("Blocked"),
Ok(a / b)
Err(error) => eprintln!("{}", error),
- binary crate — виконувана програма;
- library crate — бібліотека;
- internal crate — частина workspace;
- published crate — пакет на crates.io.;
// count = 11; // помилка
Він містить:
- висока продуктивність;
- memory safety;
- системне програмування;
- CLI tools;
- backend із високим навантаженням;
- embedded;
- WebAssembly;
- безпечна concurrency;
- криптографія;
- low-level libraries;
- FFI;
- довгострокова надійність;
- контроль ресурсів.;</syntaxhighlight>
id: 1,
</syntaxhighlight>
Enum
}
fn main() { Суть Result: помилки є собою частиною типу, з цієї причини їх важче випадково проігнорувати.; Запуск:
Async Rust застосовується для асинхронного програмування.; * Rust Reference.;У реальних проєктах частіше використовують Cargo, а не прямий виклик `rustc`.; * Safe Rust — звичайний код із гарантіями компілятора;
- Unsafe Rust — код, де дозволені низькорівневі операції, які компілятор не має змогу в цілому перевірити.;
Rust має обмеження.; b
</syntaxhighlight>
println!("{}", text);
Embedded Rust
} }
Crates
fn test_add() { Приклад: }
a + b
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
== Тематичні мітки ==
== Макроси ==
<syntaxhighlight lang="rust">
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
let counter = Arc::clone(&counter);
Потрібно контролювати:
'''Embedded Rust''' — це використання Rust для мікроконтролерів і вбудованих систем.;
fn main() { Критично: `unsafe` не вимикає всі перевірки Rust.; Водночас Rust має вищий поріг входу, ніж багато популярних мов, і потребує зміни підходу до проєктування даних і ownership.; enum Status { } {{SEO
;== Типові помилки початківців ==
text.push('!');
Tokio — популярний async runtime для Rust.;</syntaxhighlight> } Перевага: Rust змушує програміста явно описувати ownership, borrowing і mutability, з цієї причини багато помилок знаходяться ще під час компіляції.; [dependencies] Запуск тестів: match status {
Rust часто використовують там.; Cargo — це офіційно затверджений build system і package manager для Rust.; fn main() { Cargo застосовується для: fn find_user(id: u32) -> Option<String> {
Приклад із явним lifetime:
'''Generics''' дозволяють писати код, який функціонує з різними типами.; Приклад:
}
Суть ownership: Rust знає, хто відповідає за значення, і автономно звільняє ресурс, коли власник більше не потрібен.; struct User { Structif id == 1 {
Перша програма на RustПрактична роль: Cargo робить тестування частиною стандартного Rust workflow.; Rust name: String, Option застосовується, коли значення має змогу бути або не бути.; Він має іншу модель мислення, особливо через ownership, borrowing, lifetimes і строгий компілятор.;</syntaxhighlight> println!("{} {}", user.id, user.name);
Serde — одна з найпопулярніших Rust-бібліотек для серіалізації й десеріалізації.; Вони лише описують компілятору, як довго reference має змогу бути безпечним.; Приклад: fn longest<'a>(a: &'a str, b: &'a str) -> &'a str { Rust часто порівнюють із C.; } Memory safety — одна з головних цілей Rust.; Перевага для CLI: Rust надає можливість створювати швидкі й надійні інструменти, які без зайвих зусиль поширювати як один виконуваний файл.; * `println!`;
} Rust часто застосовується в системах, які працюють із важливими даними.; } else {
println!("Hello from thread");
let mut value = counter.lock().unwrap(); println!("{}", user.display_name());
Приклад: [dependencies] rustfmtprintln!("{}", result);
Суть impl: `impl` надає можливість додавати поведінку до типів без класичної об’єктної моделі з inheritance.;</syntaxhighlight> істотно: move semantics — одна з причин, чому Rust має змогу гарантувати безпеку пам’яті без garbage collector.;
Ключові елементи:
Практична роль: borrow checker часто здається суворим, але саме він знаходить багато помилок до запуску програми.; }
<div style="background:#f0eaff; border-left:6px solid #8e44ad; padding:12px; margin:12px 0;">
if b == 0.0 {
New,
<syntaxhighlight lang="rust">
!; *value += 1;
let message = String::from("hello");
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
}
}
./main
use std::thread;
Приклад:
cargo new hello_rust
let a = String::from("hello");
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
}
<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">
== Memory safety ==
<syntaxhighlight lang="rust">
Serde застосовується для:
* `async`;
* `await`;
* futures;
* async runtime;
* Tokio;
* async networking;
* async web frameworks.; '''no_std''' — це режим Rust без стандартної бібліотеки.; }
let age: u32 = 25;
rustfmt сприяє:
Приклад оголошення зовнішньої C-функції:
}
</div>
Щоб змінити значення через reference, потрібне mutable borrowing.; |-
| Memory safety
| Сильні перевірки компілятора
| Переважно відповідальність програміста
|-
| Garbage collector
| Немає
| Немає
|-
| Ownership
| Вбудована модель ownership
| Ручна дисципліна
|-
| Tooling
| Cargo, rustfmt, Clippy
| Залежить від toolchain
|-
| Складність
| Вища концептуально на старті
| Простий синтаксис, складна пам’ять
|-
| Legacy
| Молодша програмний пакет
| Величезна legacy-база
|}
let result = math::add(2, 3);
}
}
} </syntaxhighlight> fn first<T>(items: &[T]) -> Option<&T> { |
;
fn main() { let mut handles = vec![]; Приклад: fn main() { } handle.join().unwrap(); id: u32, </syntaxhighlight> let counter = Arc::new(Mutex::new(0)); use std::fs; println!("{}", text);
Сценарії: Rust і GoEnum має змогу додатково містити інформаційні дані:
Generics часто використовуються разом із traits:
'''Перевага Embedded Rust:''' він намагається дати безпечніші абстракції для low-level коду без втрати контролю над ресурсами.;</div>
}
</div>
let content = fs::read_to_string("data.txt");
Crate — це одиниця компіляції й пакування в Rust.; Приклад: Приклад: } } } істотно: Option змушує програміста явно обробити випадок відсутності значення.;</syntaxhighlight> Правило: у Rust має змогу бути багато immutable references або одна mutable reference, але не обидва варіанти одночасно.; Rust додатково порівнюють із C++.; let result = add(2, 3); Практична користь: `?` надає можливість писати чистий код обробки помилок без довгих вкладених `match`.; Some(String::from("Alice"))
|
; fn main() {
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
=== Структура і метод ===
'''Практична роль:''' Tokio є собою одним із ключових інструментів для production async Rust.; name: String,
|-
| Memory management
| Ownership без GC
| Garbage collector
|-
| Простота старту
| Складніший
| Простіший
|-
| Performance
| Дуже висока
| Висока
|-
| Concurrency
| Безпечна модель + async/threading
| Goroutines і channels
|-
| Типові задачі
| Systems, performance, embedded, WASM, backend
| Cloud services, microservices, DevOps tools
|}
<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">
height: u32,
!; Приклад:
<syntaxhighlight lang="rust">
== Option ==
<syntaxhighlight lang="rust">
fn divide(a: f64, b: f64) -> Result<f64, String> {
</div>
}
Основні переважні аспекти Rust:
<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">
use std::fs;
Коли Rust має змогу бути невдалим виборомedition = "2021" println!("{}", message);
let handle = thread::spawn(move || {
'''Критично:''' Rust зменшує клас memory-safety bugs, але не скасовує security review, threat modeling, тестування й контроль залежностей.;== Mutable borrowing ==
* персональні інформаційні дані;
* secrets;
* tokens;
* private keys;
* logs;
* error messages;
* telemetry;
* data retention;
* encryption;
* доступи;
* сторонні crates;
* серіалізацію даних.; Rust застосовується для backend-розробки.; a
== Функції ==
<syntaxhighlight lang="rust">
Якщо виникає помилка, `?` повертає її з функції.; Приклад:
== Pattern matching ==
}
* embedded;
* kernels;
* bootloaders;
* bare-metal;
* constrained environments;
* операційних систем;
* firmware.; use std::thread;
|
;== переважні аспекти Rust ==
</syntaxhighlight> fn main() {
let letter: char = 'A';
* підтримувати єдиний стиль;
* зменшувати суперечки про формат;
* покращувати читабельність;
* автоматизувати formatting у CI.; println!("Async Rust");
Приклад:
Rust має змогу взаємодіяти з C через FFI.; Go
'''Практична роль:''' struct застосовують, коли потрібно для опису об’єктів, конфігурацій, даних API, доменних моделей і стану програми.; }
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
Tokio застосовується для:
}
* дуже швидких прототипів;
* простих CRUD-застосунків;
* команд без часу на навчання;
* задач, де Python або Go дають достатню продуктивність;
* проєктів із сильними вимогами до готових domain-бібліотек, яких у Rust ще немає;
* сценаріїв, де потрібна велика кількість junior-розробників без Rust-досвіду.; fn display_name(&self) -> String {
<syntaxhighlight lang="rust">
}
'''істотно:''' Rust не потрібно використовувати всюди.; Traits використовуються для:
if let Some(name) = find_name(1) {
name: String::from("Alice"),
'''enum''' у Rust набагато потужніший, ніж enum у багатьох інших мовах.; cargo fmt
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
Quit,
`Result` має два варіанти:
cd hello_rust
} else {
'''Практична роль:''' modules дозволяють розділяти великий Rust-проєкт на зрозумілі частини.; * Rust by Example.;<syntaxhighlight lang="rust">
Перевага: Rust надає можливість писати concurrent code з сильнішими гарантіями безпеки, ніж багато низькорівневих мов.; Критерій cargo run } format!("{} #{}", self.name, self.id)
}
Кожне значення в Rust має власника.; завдяки наявності завдяки наявності ownership і type system Rust користувачі можуть уникати data races.; println!("{}", b); async fn main() { * надмірна боротьба з borrow checker;
* зайве використання `clone`;
* використання `String` там, де достатньо `&str`;
* часте `unwrap` без обробки помилок;
* неправильне розуміння lifetimes;
* спроба писати Rust як C++ або Java;
* занадто складні generic types;
* ігнорування Clippy;
* страх перед `Result` і `Option`;
* надмірне використання `Arc<Mutex<T>>`;
* спроба використовувати unsafe без потреби.;== Cargo ==
let b = a;
== Traits ==
version = "0.1.0"
* офіційно затверджений сайт Rust.; struct Rectangle {
add_exclamation(&mut message);
struct User {
</div>
anyhow = "1"
== Обмеження Rust ==
};
== Cargo.toml ==
</div>
let content = fs::read_to_string(path)?;
fn print(&self);
</div>
== Result ==
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
'''Суть match:''' Rust змушує явно обробляти всі важливі варіанти, що зменшує кількість пропущених випадків.; print_text(&message);
fs::read_to_string(path)
'''Ownership''' — це центральна концепція Rust.;<syntaxhighlight lang="rust">
'''Основна ідея:''' Rust намагається поєднати продуктивність C/C++ із сильнішими гарантіями безпеки пам’яті на етапі компіляції.;</div>
* `clap`;
* `structopt`;
* `anyhow`;
* `thiserror`;
* `serde`;
* `tokio`;
* `tracing`.; Rust має статичну типізацію.; Її головні концепції — ownership, borrowing, lifetimes, traits, Result, Option і pattern matching.; Найбільшу цінність він дає там, де помилки пам’яті, продуктивність і надійність справді критичні.; '''Практична роль:''' Serde є собою стандартним вибором для роботи з форматами даних у Rust-проєктах.; }
Для запуску async-коду зазвичай потрібен runtime, як ілюстрація Tokio.; }
</div>
fn main() {
}
Рекомендовано:
'''Практична роль:''' threads дозволяють виконувати код паралельно, але доступ до shared state потрібно контролювати.; Status::Active => println!("Active"),
}
fn main() {
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
Clippy сприяє знаходити:
rustc main.rs Приклад: fn main() { name: String, Ownership |
; Rust
|
|---|---|---|---|---|
| Memory safety | Ownership і borrow checker | RAII, smart pointers, але багато небезпечних можливостей | ||
| Абстракції | Traits, generics, enums | Classes, templates, inheritance, RAII | ||
| Tooling | Єдиний Cargo workflow | Різні build systems і package managers | ||
| Складність | Складний borrow checker | Дуже велика й складна мова | ||
| Performance | Висока | Висока |
Приклад: Приклад derive: Rust — це сучасна системна мова програмування, яка поєднує високу продуктивність, відсутність garbage collector і сильні гарантії memory safety.; Окремо варто відзначити де раніше традиційно застосовували C або C++: системні утиліти, серверні застосунки, embedded, WebAssembly, CLI-інструменти, мережеві сервіси, інфраструктурне програмне забезпечення, криптографія, блокчейн, ігрові рушії і високопродуктивні бібліотеки.; Створення нового проєкту: }
name: String,
Суть mutability: Rust заохочує незмінність за замовчуванням, а змінність потрібно вказувати явно.;</syntaxhighlight>
}
};
assert_eq!(add(2, 3), 5);
Функції в Rust оголошуються через `fn`.; fn main() { Rust застосовується у різних напрямах розробки.; застосовується для:
Класичний приклад програми на Rust:
Rust має сильну модель concurrency.;== Rust і C++ ==
}
Blocked,
<syntaxhighlight lang="rust">
Rust має потужну систему макросів.; Критерій
// println!("{}", a); // помилка: a більше не є собою власником
println!("Found: {}", name);
<syntaxhighlight lang="rust">
if a.len() > b.len() {
Active,
* високий поріг входу;
* складність ownership і lifetimes;
* довший час компіляції;
* async Rust має змогу бути складним;
* не всі бібліотеки такі зрілі, як у C/C++ або Python;
* borrow checker потребує зміни мислення;
* іноді складніше оперативно написати прототип;
* unsafe все одно потрібен у низькорівневих сценаріях;
* складні generic і trait bounds можуть ускладнювати код.; '''Практична роль:''' rustc не лише компілює код, а й виконує суворі перевірки ownership, borrowing, lifetimes і типів.;== Serde ==
}
Rust особливо корисний для системного програмування, CLI, backend-сервісів, embedded, WebAssembly, безпечної concurrency і performance-sensitive software.; * Документація rustfmt і Clippy.; '''Правило:''' навіть memory-safe мова не захищає від логічного витоку даних, якщо програма сама записує secrets у logs або передає їх не туди.;<syntaxhighlight lang="rust">
</div>
Приклад:
items.first()
У простих випадках компілятор виводить lifetimes сам.;== Borrow checker ==
'''Помилка:''' очікувати, що Rust одразу буде таким же швидким у розробці, як Python або JavaScript.; * Rustonomicon.; width: u32,
</syntaxhighlight>
Суть функції: функція в Rust має чіткі типи аргументів і тип результату.; let mut count = 10;
rustfmt — інструмент форматування Rust-коду.;Приклад: }
let handle = thread::spawn(|| {
</syntaxhighlight>
self.width * self.height
== Arc і Mutex ==
cargo doc
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
<syntaxhighlight lang="bash">
}
* мережевих сервісів;
* async I/O;
* HTTP-серверів;
* TCP/UDP;
* background tasks;
* timers;
* channels;
* високонавантажених backend-систем.; Приклад компіляції одного файлу:
fn area(&self) -> u32 {
<syntaxhighlight lang="rust">
fn read_config(path: &str) -> Result<String, io::Error> {
Приклад сфер сфера застосування:
Ok(text) => println!("{}", text),
<syntaxhighlight lang="rust">
* `Result<T, E>` для recoverable errors;
* `Option<T>` для відсутності значення;
* `panic!` для unrecoverable errors;
* `?` для передачі помилок;
* crates на кшталт `thiserror` і `anyhow`.; Критерій
trait Printable {
}
enum Status {
}
</div>
</div>
|-
| Виконання
| Компіляція
| Інтерпретований runtime
|-
| Швидкість розробки
| Повільніший старт, суворіший компілятор
| Дуже швидке прототипування
|-
| Performance
| Дуже висока
| Нижча для CPU-bound задач
|-
| Memory management
| Ownership
| Garbage collector
|-
| Типові задачі
| Systems, backend, CLI, WASM, embedded
| Data science, scripting, web, automation, AI
|}
</div>
<div style="background:#eef2ff; border-left:6px solid #4f46e5; padding:12px; margin:12px 0;">
!; * Rust Standard Library Documentation.;</div>
}
fn read_file(path: &str) -> Result<String, io::Error> {
Оператор `?` спрощує передачу помилки вище.; '''impl''' застосовується для реалізації методів для типу.; Він перетворює Rust-код на виконуваний файл або бібліотеку.; fn print_status(status: Status) {
println!("{}", message);
Коли варто використовувати Rust
let mut message = String::from("hello");
Типи даних
Приклад:
}
Приклад: Rust не використовує exceptions у звичному стилі.; Ok(content) => println!("{}", content), cargo check
Приклад:
Висновок: Go часто простіший для cloud-сервісів, а Rust краще підходить там, де критичні контроль ресурсів, performance і memory safety.; Основна відмінність Rust.; Rust
Trait описує поведінку, яку має змогу реалізувати тип.;== WebAssembly ==
Rust добре підходить для WebAssembly.; println!("{}", *counter.lock().unwrap()); Rust дуже популярний для створення command-line tools.; Err(error) => println!("Error: {}", error), Підказка: у Rust-прикладах істотно дивитися не лише на синтаксис, а й на ownership, Result, Option і borrowing.; pub fn add(a: i32, b: i32) -> i32 {
rustc — це компілятор Rust.;</syntaxhighlight>
Практична роль: Rust має змогу бути хорошим вибором для backend-сервісів, де важливі продуктивність, надійність і контроль ресурсів.;Загальний характеристика
Залежності описуються у файлі `Cargo.toml`.; }
Небезпека: найгірший Rust-код часто виникає тоді, коли програміст намагається обійти модель ownership замість того, щоб перепроєктувати структуру даних.; Практична роль: async Rust корисний для високонавантажених мережевих сервісів, де потрібно обробляти багато одночасних операцій вводу-виводу.; Приклад:
</syntaxhighlight>
- [derive(Serialize, Deserialize)]
Tokio
Перевага Cargo: Rust має сильну стандартну культуру збірки, тестування й залежностей, з цієї причини старт проєкту зазвичай простіший, ніж у C/C++.; Критерій Rust добре підходить, коли потрібні:
Практична порада: Rust варто обирати, якщо потрібні продуктивність і безпека пам’яті, а команда готова прийняти сувору модель мови.; Borrowing надає можливість тимчасово передати доступ до значення без передачі ownership.; {| class="wikitable"
Суть borrowing: значення можна “позичити” функції, не передаючи їй власність.; fn print_text(text: &String) { cargo test
fn main() {
<syntaxhighlight lang="rust">
mod math {
Web development
let status = Status::Active;
Rust має вбудовану підтримку тестування.; {| class="wikitable" Concurrency у Rust має змогу включати: Увага: `Arc<Mutex<T>>` корисний, але надмірне використання shared mutable state має змогу ускладнювати програму.; Головна перевага: Rust дає memory safety без garbage collector, використовуючи ownership, borrowing і перевірки компілятора.; });
Blocked,
- [tokio::main]
cargo build
'''Висновок:''' Rust і C++ обидві підходять для high-performance systems, але Rust більше фокусується на memory safety через типову систему й borrow checker.;</div>
Коли `text` виходить з області видимості, пам’ять для `String` звільняється автономно.; None => println!("User not found"),
let active: bool = true;
* неідіоматичний код;
* потенційні помилки;
* зайві clones;
* неправильні patterns;
* simplifications;
* performance issues;
* readability issues.; Він контролює:
}
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
== Impl ==
`Arc` і `Mutex` часто використовуються для безпечного спільного стану між потоками.; fn find_name(id: u32) -> Option<String> {
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
'''Практичний висновок:''' Python зручний для швидких сценаріїв і data science, а Rust — для продуктивних, надійних і системних компонентів.;
CLI-інструменти
fn main() {
fn main() {
Приватність даних
Причини:
width: 10,
let user = User {
match content {
Result застосовується для обробки помилок.; C
</syntaxhighlight>
- threads;
- channels;
- mutex;
- atomic types;
- async/await;
- task runtimes;
- message passing;
- shared state із контролем доступу.; } else {
Modules допомагають організувати код.; } else {
;
</syntaxhighlight>
fn add(a: i32, b: i32) -> i32 {
- системне програмування;
- CLI-інструменти;
- серверні застосунки;
- high-performance backend;
- embedded systems;
- WebAssembly;
- мережеві сервіси;
- криптографічні бібліотеки;
- блокчейн;
- game development;
- операційні системи;
- драйвери;
- бази даних;
- компілятори;
- інфраструктурне ПЗ;
- security-sensitive software.; Ok(value) => println!("{}", value),
match divide(10.0, 2.0) {
unsafe {
});
for _ in 0..5 {
</syntaxhighlight>
let price: f64 = 19.99;
Ok(content)
use std::fs; Rust сприяє уникати багатьох типових помилок:
Висновок: C дає прямий контроль і величезну legacy-сумісність, а Rust додає сильніші compile-time гарантії безпеки.; Головне правило: ідіоматичний Rust — це код, який використовує типи, ownership, Result, pattern matching і tests для явного опису коректної поведінки.;
fn main() {
'''Перевага enum:''' Rust enum надає можливість описувати різні варіанти стану без небезпечних null або неявних структур.; * Документація crates.io.;== no_std ==
<syntaxhighlight lang="rust">
У Rust значення має змогу бути переміщене від одного власника до іншого.; Основні типи:
Для чого застосовується Rust
істотно: у production-коді краще повертати `Result`, а не покладатися на `panic!` для звичайних помилок.; Active,
Status::New => println!("New"),
handle.join().unwrap();
<syntaxhighlight lang="rust">
Rust в embedded має змогу бути корисний завдяки наявності:
a + b
== Висновок ==
<syntaxhighlight lang="bash">
struct User {
'''Практична роль:''' типи допомагають Rust знаходити помилки ще під час компіляції.;
Testing
- unsafe code;
- dependency vulnerabilities;
- supply chain risks;
- cryptographic correctness;
- input validation;
- authentication;
- authorization;
- secrets;
- логування чутливих даних;
- network security;
- business logic bugs;
- panic у production;
- race conditions у зовнішніх системах.; a + b
Async Rust
Crate має змогу бути:
Основні підходи:
}
- Axum;
- Actix Web;
- Rocket;
- Warp;
- Tide.; Суть trait: trait описує, що тип уміє робити, не прив’язуючись до конкретної реалізації.; Приклад:
}
if id == 1 {
Приклад:
height: 5,
- `Ok(value)` — успішний результат;
- `Err(error)` — помилка.;
</div> } == Джерела == println!("{}", rect.area()); === Обробка Option === == Borrowing == Типові сценарії: } </div> impl User { let count = 10;
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
}
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
struct User {
<syntaxhighlight lang="rust">
== Clippy ==
Приклад:
== Rust і Python ==
</div>
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
<syntaxhighlight lang="rust">
Приклад:
</div>
handles.push(handle);
'''істотно:''' no_std не означає “без Rust”.;<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
};
Щоб змінна була змінною, потрібно явно написати `mut`:
<syntaxhighlight lang="rust">
<div style="background:#fef2f2; border-left:6px solid #ef4444; padding:12px; margin:12px 0;">
Text(String),
cargo test
}
cargo run
}
</div>
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
=== Простий Result ===
<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">
Lifetimes
use std::sync::{Arc, Mutex};
Err(String::from("Division by zero"))
* memory safety;
* no_std;
* контролю ресурсів;
* відсутності garbage collector;
* strong typing;
* безпечнішим abstractions;
* функціональні можливості працювати близько до hardware.;<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
'''Rust''' — це сучасна компільована мова програмування, орієнтована на безпеку пам’яті, високу продуктивність, надійну конкурентність і системне програмування.; enum Message {
* REST API;
* microservices;
* high-performance backend;
* WebSocket-сервіси;
* API gateways;
* internal tools;
* edge services.; Приклад:
Unsafe потрібен для:
'''Lifetimes''' — це спосіб Rust описувати, як довго references залишаються дійсними.;
Rust не має звичайного `null` для більшості safe-сценаріїв.; [package]
Безпека Rust
Some(name) => println!("User: {}", name),
платформа ownership і borrowing забезпечується через Rust створений; додатково реалізовано яка надає можливість компілятору перевіряти правильність роботи з пам’яттю ще до запуску програми виступає ключовою рисою розробки швидкого й надійного програмного забезпечення без garbage collector.;== Move semantics ==
println!("{}", result);
WebAssembly або WASM — це формат виконання, який надає можливість запускати код у браузері та інших середовищах.; }
fn main() {
Головна перевага: Rust надає можливість писати продуктивний низькорівневий код із сильнішими гарантіями безпеки, ніж традиційні системні мови.;</syntaxhighlight>