Перейти до вмісту

Rust

Матеріал з K2 ERP Wiki

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 clippy id: u32, </syntaxhighlight> fn print_item<T: std::fmt::Display>(item: T) { FFI застосовується для: }

У реальних проєктах частіше використовують 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

println!("Not found");

fn add(a: i32, b: i32) -> i32 {

Поширені помилки:

  • абстракцій;
  • polymorphism;
  • generic programming;
  • спільних інтерфейсів;
  • dependency boundaries;
  • тестування;
  • бібліотек.; * Документація Tokio.; Практична роль: generics дозволяють створювати гнучкі бібліотеки без втрати типобезпеки.; let rect = Rectangle {
name: String,
  1. [derive(Debug)]

Типові команди:

}

Необхідно контролювати: use std::io;

None
// низькорівневі операції

Rust і Python мають дуже різні ролі.; Rust

;== Типові помилки початківців ==
  • JSON;
  • YAML;
  • TOML;
  • MessagePack;
  • API;
  • конфігурацій;
  • збереження даних;
  • обміну повідомленнями.; Практична роль: crates дозволяють повторно використовувати бібліотеки й будувати модульні Rust-проєкти.;== Concurrency ==
  • `i8`, `i16`, `i32`, `i64`, `i128`, `isize`;
  • `u8`, `u16`, `u32`, `u64`, `u128`, `usize`;
  • `f32`, `f64`;
  • `bool`;
  • `char`;
  • `String`;
  • `&str`;
  • tuples;
  • arrays;
  • slices;
  • structs;
  • enums.;
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> {

  • хто володіє значенням;
  • чи можна використовувати reference;
  • чи не живе reference довше за значення;
  • чи немає одночасного mutable і immutable доступу;
  • чи немає data race в safe Rust.; Його сила — у надійності й контролі, а не в мінімальному порозі входу.; }
  • dangling references;
  • use-after-free;
  • double free;
  • data races;
  • некоректному shared mutable state;
  • частині invalid memory access.; println!("Hello, world!");
`pub` робить елемент доступним ззовні модуля.;
Приклад із явним lifetime:
'''Generics''' дозволяють писати код, який функціонує з різними типами.; Приклад:

 }

Суть ownership: Rust знає, хто відповідає за значення, і автономно звільняє ресурс, коли власник більше не потрібен.; struct User {

Struct

if 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!`;

  • `vec!`;
  • `format!`;
  • procedural macros;
  • derive macros.; C++

} Rust часто застосовується в системах, які працюють із важливими даними.; } else {

  • створення проєктів;
  • збірки;
  • запуску;
  • тестування;
  • керування залежностями;
  • публікації crates;
  • форматування workflow;
  • запуску прикладів;
  • документації.; Порада: `cargo clippy` варто запускати регулярно, особливо перед pull request.; String::from("data")
println!("Hello from thread");
let mut value = counter.lock().unwrap();
println!("{}", user.display_name());

Приклад: [dependencies]

rustfmt

println!("{}", result);

Суть impl: `impl` надає можливість додавати поведінку до типів без класичної об’єктної моделі з inheritance.;</syntaxhighlight>

істотно: move semantics — одна з причин, чому Rust має змогу гарантувати безпеку пам’яті без garbage collector.;
  1. [test]

Ключові елементи:

Практична роль: 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 і Go

Enum має змогу додатково містити інформаційні дані:
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"))

  1. ![no_std]
; 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;
Pattern matching надає можливість комфортно обробляти enum, Option, Result та інші структури.;
;== переважні аспекти 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)

}

  • виклику C-бібліотек;
  • створення Rust-бібліотек для C;
  • інтеграції з legacy code;
  • системних API;
  • embedded SDK;
  • high-performance modules.; fn abs(input: i32) -> i32;

Кожне значення в 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>

  1. [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,
  1. [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};

; println!("{}", item);
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>