Rust (укр. Раст, дос. «Іржа») — сучасна багатопарадигмова мова програмування загального призначення. Мова має сильну (строгу) типізацію і зосереджена на безпечній роботі з пам'яттю та забезпеченні високої рівночасности виконання задач (можливість породжувати тисячі й навіть мільйони підпроцесів).
Rust | |
---|---|
Парадигма | імперативна, рівночасна, структурна, узагальнена, функційна |
Дата появи | 2010 |
Творці | Ґрейдон Гоар |
Розробник | Rust Project Developers |
Останній реліз | 1.79.0 (13 червень 2024) |
Система типізації | [en], вивідна, [en], (статична), строга |
Під впливом від | Alef, C#, , Cyclone, Elm, Erlang, Haskell, Limbo, Newsqueak, OCaml, Ruby, Scheme, Standard ML, Swift |
Мова реалізації | Rust |
Платформа | Windows, Linux, macOS, FreeBSD, iOS, Android, кросплатформова програма і WebAssembly |
Операційна система | Linux, macOS, Windows, FreeBSD |
Ліцензія | Apache License 2.0 або ліцензія MIT |
Звичайні розширення файлів | .rs .rlib |
Репозиторій вихідного коду | github.com/rust-lang/rust |
Вебсайт | www.rust-lang.org |
|
Початковий код проєкту поширюється під ліцензією MIT.
Історія
Робота над мовою була розпочата працівником Mozilla Ґрейдоном Гоаром 2006 року як особистий проєкт. 2009 до розроблення підключилася Mozilla, а 2010 року мова була офіційно представлена на Mozilla Summit 2010. З 2021, після скорочень у Mozilla, розроблення здійснює окремий фонд Rust Foundation. Мову названо за назвою родини грибів іржа. 2010 року розроблення мови було переведено з попередньої версії компілятора, яка була написана мовою OCaml, на компілятор, який написаний безпосередньо на Rust, з використанням LLVM як бекенду. 2011 року новий компілятор успішно скомпілював сам себе.
Перший стабільний випуск мови Rust 1.0 відбувся 15 травня 2015 після п'яти років розроблення, він ознаменував повну стабілізацію програмних інтерфейсів усіх бібліотек і мовних конструкцій. У процесі підготовки гілки Rust 1.0 програмні інтерфейси та можливості мови піддалися значному огляду, після якого типово залишені лише повністю готові до застосування можливості, реалізація яких не змінюватиметься надалі. Усі інші особливості переведені в розряд експериментальних і винесені зі стандартного постачання.
Опоруч Mozilla Research розвиває експериментальний браузерний рушій Servo, написаний мовою Rust з підтримкою багатопотокового рендерингу вебсторінок і розрівнобіжненням операцій з DOM, а компанія Samsung займається його портуванням на Android та ARM процесори.
Огляд
За структурою, мова Rust нагадує , але істотно відрізняється в деяких дрібницях реалізації синтаксису та семантики, а також зосередженням на блочну організацію структури коду, яка дозволяє реалізувати завдання, подібно до легковагих співпрограм. Автоматичне керування пам'яттю позбавляє розробника потреби маніпулювання вказівниками й захищає від проблем, що виникають через низькорівневу роботу з пам'яттю, таких як звернення до ділянки пам'яти після її звільнення, розіменовування нульових вказівників, вихід за межі буфера тощо. Rust підтримує суміш імперативних, процедурних і об'єктно-орієнтованих методів з такими парадигмами, як функційне програмування і модель акторів, а також узагальнене програмування і метапрограмування, у статичних і динамічних стилях.
Синтаксис та особливості
Особливості мови
Основні можливості мови:
- Зосередження на безпеку
- Дбала робота з пам'яттю — жодних нульових і завислих вказівників. Автоматичне керування пам'яттю без збирача сміття, самими гарантіями компілятора («контролер позичань»);
- Контроль мінливости. Об'єкти усталено немінливі (англ. immutable);
- Безпека динамічного виконання: обробка збоїв, винятки, ведення лоґу, RAII/dtors;
- Typestate: можливість визначення складних інваріантів, що контролюють структури даних.
- Зосередження на рівночасність і ефективність коду
- Явне керування пам'яттю, керування схемою розподілу пам'яти;
- Украй легкі задачі, що формуються як співпрограми. Легкість у породженні тисяч і мільйонів підпроцесів;
- Ітератори стека (фактично лямбда-блоки без розподілу купи);
- Статична, нативна компіляція зі створенням виконуваних файлів ELF, [en], Mach-O;
- Прямий і простий інтерфейс для коду на мові Сі.
- Зосередження на практичне застосування
- Багатопарадигмова, функційна, імперативно-процедурна, підтримка рівнобіжної моделі акторів;
- Функції вищого порядку зі зв'язуванням;
- Немає іменних типів чи ієрархії типів;
- Багатоплатформна, підтримується Windows, Linux, macOS, *BSD;
- Зберігання рядків у UTF-8, різноманітність низькорівневих типів;
- Працює з наявними нативними наборами інструментів: GNU Debugger, Valgrind, Shark тощо;
- Практична можливість порушення правил: можливість нехтування правил безпеки, якщо чітко вказано, коли і як їх порушувати.
Володіння і контролер позичань
Виразною особливістю Rust є система володіння даними, забезпечена частиною компілятора, що зветься контролером позичань (англ. borrow checker). Позичанням зветься створення посилання.
Правила володіння і позичання:
- дані завжди ініціалізовані;
- у даних кожну мить може бути лише один володілець (змінна);
- під час знищення володільця (наприклад, під час виходу з области видимости) дані звільняються;
- на дані може бути кілька немінливих посилань;
- на дані може бути лише одне мінливе посилання, якщо немає немінливих.
Контролер позичань являє собою чи не найскладніше, з чим доводиться стикатися новим розробникам Rust. Він забороняє дуже багато практик, до яких можна легко звикнути в інших мовах програмування; натомість він захищає програміста від багатьох поширених в інших мовах помилок, таких як суперечності в даних (одна частина програми не може їх змінити, коли на них є посилання з іншої частини), зміна ітерованого об'єкта під час ітерації, гонитва даних і т. д.
Риси
Риси (також іноді трейти, типажі, англ. traits) є однією з виразних особливостей Rust. Риси загалом нагадують інтерфейси в мовах програмування, що підтримують ООП, і позначають спільну поведінку різних типів.
Типи даних
Прості (примітивні) типи
Тип | Опис | Приклад |
---|---|---|
|
|
|
|
|
|
| Цілі числа розміром із вказівник (розмір залежить від платформи) |
|
| Числа з рухомою комою | -3f32 |
char | Символ (займає 4 байти) |
|
str |
|
|
bool | Булевий тип (займає 1 байт) |
|
[T] | Зріз — динамічно змінюване представлення в суміжній послідовності |
|
! | [en] | let x = { return 123 }; |
Складені типи
Тип | Опис | Приклад |
---|---|---|
(T, U, …) |
|
|
[T; N] |
| [i64; 10] (масив з 10 чисел типу i64 ) |
Типи зі стандартної бібліотеки
Тип | Опис | Приклад |
---|---|---|
String | Динамічний рядок, що зберігає дані в купі |
|
Option<T> | [en] |
|
Result<T, E> | Обробка помилок |
|
Vec<T> | Вектор (динамічний масив) |
|
VecDeque | Двобічна черга на основі циклічного буфера | let mut buf = VecDeque::new(); buf.push_back(3); buf.push_back(4); buf.push_back(5); assert_eq!(buf.get(1), Some(&4)); |
LinkedList<T> | Зв'язаний список | let mut my_list = LinkedList::new(); my_list.push_back('b'); my_list.push_back('c'); |
HashMap<K, V> | Геш-таблиця | let mut player_stats = HashMap::new(); player_stats.insert("damage", 1); player_stats.entry("health").or_insert(100); |
BTreeMap<K, V> | Б-дерево | let mut solar_distance = BTreeMap::from([ ("Mercury", 0.4), ("Venus", 0.7), ]); solar_distance.entry("Earth").or_insert(1.0); |
HashSet | Множина на основі геш-таблиці | let mut books = HashSet::new(); books.insert("A Dance With Dragons".to_string()); books.insert("To Kill a Mockingbird".to_string()); books.insert("The Odyssey".to_string()); |
BTreeSet | Множина на основі Б-дерева | let mut planets = BTreeSet::new(); planets.insert("Mars"); planets.insert("JUpiter"); |
BinaryHeap | Двійкова купа | let mut heap = BinaryHeap::new(); heap.push(1); heap.push(5); heap.push(2); |
Вказівники
Тип | Опис | Приклад |
---|---|---|
| Посилання (немінливі та мінливі) | let x_ref = &x; let x_ref = &mut x; |
|
| let x_ptr = &x as *const T; let x_ptr = &mut x as *mut T; |
Визначені користувачем типи
Тип | Опис |
---|---|
struct | Структура |
union |
|
enum |
|
Приклади
Наведені нижче приклади є робочими під час збирання за допомогою стабільної версії компілятора Rust 1.63.0, видання 2021.
fn main() { println!("hello, world"); }
Три версії реалізації функції пошуку факторіала: у рекурсивному та ітеративному способах:
// Умовна інструкція, що показує можливість неявного повернення значення (implicit return). // На відміну від C++ і схожих мов, у Rust інструкція «if» насправді є виразом, і може повертати значення. // Якщо у функції не вказано явного return, повертається останнє значення в тілі функції. fn recursive_factorial(n: u32) -> u32 { if n <= 1 { 1 } else { n * recursive_factorial(n - 1) } } fn iterative_factorial(n: u32) -> u32 { // Змінні оголошуються ключовим словом `let`. // Ключове слово `mut` робить змінні мінливими (дозволяє змінюватися) let mut i = 1u32; let mut result = 1u32; while i <= n { result *= i; i += 1; } return result; // Явне повернення значення, на відміну від попередньої функції } fn iterator_factorial(n: u32) -> u32 { // Ітератори мають багато методів для трасформації // |accum, x| визначає анонімну функцію. // Оптимізації на кшталт вбудування тіла функції дозволяють інтервалу // і fold досягати продуктивности, подібної до iterative_factorial. (1..=n).fold(1, |accum, x| accum * x) } fn main() { println!("Recursive result: {}", recursive_factorial(10)); println!("Iterative result: {}", iterative_factorial(10)); println!("Iterator result: {}", iterator_factorial(10)); }
Показ вбудованих у Rust унікальних розумних вказівників, разом з [en] та методами:
use IntList::{Node, Empty}; // Ця програма визначає рекурсивну структуру даних та реалізує для неї методи. // Рекурсивні структури даних потребуть шару розіменування, який тут забезпечується // унікальним вказівником, побудованим за допомогою конструктора `Box::new`. Вони // аналогічні бібліотечному типу C++ `std::unique_ptr`, хоча й мають більше статичних // гарантій безпеки. fn main() { let list = IntList::new().prepend(3).prepend(2).prepend(1); println!("Sum of all values in the list: {}.", list.sum()); println!("Sum of all doubled values in the list: {}.", list.multiply_by(2).sum()); } // `enum` визначає тип-суму, що може бути одним з декількох різних видів значень під час виконання. // Тут тип або не міститиме значення, або міститиме значення і вказівник на інший `IntList`. enum IntList { Node(i32, Box<IntList>), Empty } // Блок `impl` дозволяє визначати методи для типу. impl IntList { fn new() -> Box<IntList> { Box::new(Empty) } fn prepend(self, value: i32) -> Box<IntList> { Box::new(Node(value, Box::new(self))) } fn sum(&self) -> i32 { // Вирази `match` є типовим способом застосування зіставлення із взірцем // і дещо схожі на інструкцію `switch` із C та C++. match *self { Node(value, ref next) => value + next.sum(), Empty => 0 } } fn multiply_by(&self, n: i32) -> Box<IntList> { match *self { Node(value, ref next) => Box::new(Node(value * n, next.multiply_by(n))), Empty => Box::new(Empty) } } }
Простий показ легковагих можливостей рівночасности Rust:
// Ця функція створює десять рівночасно виконуваних ниток. // Для перевірки можете запустити програму кілька разів і побачити // зміну порядку, у якому виводяться повідомлення різних нитей. fn main() { // Цей рядок немінливий і тому різні нитки можуть отримувати доступ до нього let greeting = "Hello"; // Функція `scope` створює нитки, що не будуть знищені до кінця своєї роботи // аргумент анонімної функції - об'єкт типу `Scope`, який і триматиме нитки std::thread::scope(|s| { for num in 0..10 { // `move` визначає захоплення за значенням s.spawn(move || { // `println!` - це макрос, що формує виведення за форматним рядком під час компіляції // Макроси в Rust структурні (як у Scheme), а не текстові (як у C). println!("{greeting} from thread number {num}"); }); } }); }
Українська спільнота Rust
Існує і жваво розвивається українська гілка Rust-спільноти. Метою спільноти є популяризація Rust в Україні й розвиток спільноти навколо нього, запуск або сприяння розвитку всеукраїнських менторських і освітніх програм, залучення проєктів на Rust та пов'язаних з ними інвестицій в Україну.
Створено підбірку навчальних матеріалів, завершується робота над перекладом підручника.[]
Примітки
- Announcing Rust 1.79.0. 13 червень 2024. Процитовано 14 червень 2024.
- COPYRIGHT. Rust compiler source repository. Процитовано 17 грудня 2012.
- . 14 вересня 2010. Архів оригіналу за 20 липня 2020. Процитовано 17 квітня 2012.
- Future Tense. 29 квітня 2011. Архів оригіналу за 18 вересня 2012. Процитовано 17 квітня 2012.
At Mozilla Summit 2010, we launched Rust, a new programming language motivated by safety and concurrency for parallel hardware, the “manycore” future which is upon us.
- Hello World!. Rust Foundation (англ.). 8 лютого 2020. оригіналу за 19 квітня 2022. Процитовано 4 червня 2022.
- Hoare, Graydon (7 червня 2014). . Reddit.com. Архів оригіналу за 14 липня 2016. Процитовано 4 лютого 2018.
- Hoare, Graydon (2 жовтня 2010). Rust Progress. Архів оригіналу за 18 вересня 2012. Процитовано 17 квітня 2012.
- Hoare, Graydon (20 квітня 2011). . Архів оригіналу за 20 липня 2011. Процитовано 17 квітня 2012.
After that last change fixing the logging scope context bug, looks like stage1/rustc builds. Just shy of midnight :)
- . Архів оригіналу за 15 травня 2015. Процитовано 16 травня 2015.
- . Ars Technica. Архів оригіналу за 16 грудня 2016. Процитовано 24 жовтня 2015.
- . dou.ua. Архів оригіналу за 12 червня 2022. Процитовано 13 вересня 2022.
Посилання
- Офіційний сайт
- Rust Language Wiki [ 10 лютого 2014 у Wayback Machine.]
- Електронний архів email листування Rust-dev [ 14 березня 2012 у Wayback Machine.]
- Основний репозиторій вихідних текстів та баг-трекер [ 3 вересня 2013 у Wayback Machine.]
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Rust ukr Rast dos Irzha suchasna bagatoparadigmova mova programuvannya zagalnogo priznachennya Mova maye silnu strogu tipizaciyu i zoseredzhena na bezpechnij roboti z pam yattyu ta zabezpechenni visokoyi rivnochasnosti vikonannya zadach mozhlivist porodzhuvati tisyachi j navit miljoni pidprocesiv RustParadigmaimperativna rivnochasna strukturna uzagalnena funkcijnaData poyavi2010TvorciGrejdon GoarRozrobnikRust Project DevelopersOstannij reliz1 79 0 13 cherven 2024 Sistema tipizaciyi en vividna en statichna strogaPid vplivom vidAlef C C Cyclone Elm Erlang Haskell Limbo Newsqueak OCaml Ruby Scheme Standard ML SwiftMova realizaciyiRustPlatformaWindows Linux macOS FreeBSD iOS Android krosplatformova programa i WebAssemblyOperacijna sistemaLinux macOS Windows FreeBSDLicenziyaApache License 2 0 abo licenziya MITZvichajni rozshirennya fajliv rs rlibRepozitorij vihidnogo kodugithub com rust lang rustVebsajtwww rust lang org Mediafajli u Vikishovishi Pochatkovij kod proyektu poshiryuyetsya pid licenziyeyu MIT IstoriyaRobota nad movoyu bula rozpochata pracivnikom Mozilla Grejdonom Goarom 2006 roku yak osobistij proyekt 2009 do rozroblennya pidklyuchilasya Mozilla a 2010 roku mova bula oficijno predstavlena na Mozilla Summit 2010 Z 2021 pislya skorochen u Mozilla rozroblennya zdijsnyuye okremij fond Rust Foundation Movu nazvano za nazvoyu rodini gribiv irzha 2010 roku rozroblennya movi bulo perevedeno z poperednoyi versiyi kompilyatora yaka bula napisana movoyu OCaml na kompilyator yakij napisanij bezposeredno na Rust z vikoristannyam LLVM yak bekendu 2011 roku novij kompilyator uspishno skompilyuvav sam sebe Pershij stabilnij vipusk movi Rust 1 0 vidbuvsya 15 travnya 2015 pislya p yati rokiv rozroblennya vin oznamenuvav povnu stabilizaciyu programnih interfejsiv usih bibliotek i movnih konstrukcij U procesi pidgotovki gilki Rust 1 0 programni interfejsi ta mozhlivosti movi piddalisya znachnomu oglyadu pislya yakogo tipovo zalisheni lishe povnistyu gotovi do zastosuvannya mozhlivosti realizaciya yakih ne zminyuvatimetsya nadali Usi inshi osoblivosti perevedeni v rozryad eksperimentalnih i vineseni zi standartnogo postachannya Oporuch Mozilla Research rozvivaye eksperimentalnij brauzernij rushij Servo napisanij movoyu Rust z pidtrimkoyu bagatopotokovogo renderingu vebstorinok i rozrivnobizhnennyam operacij z DOM a kompaniya Samsung zajmayetsya jogo portuvannyam na Android ta ARM procesori OglyadZa strukturoyu mova Rust nagaduye C ale istotno vidriznyayetsya v deyakih dribnicyah realizaciyi sintaksisu ta semantiki a takozh zoseredzhennyam na blochnu organizaciyu strukturi kodu yaka dozvolyaye realizuvati zavdannya podibno do legkovagih spivprogram Avtomatichne keruvannya pam yattyu pozbavlyaye rozrobnika potrebi manipulyuvannya vkazivnikami j zahishaye vid problem sho vinikayut cherez nizkorivnevu robotu z pam yattyu takih yak zvernennya do dilyanki pam yati pislya yiyi zvilnennya rozimenovuvannya nulovih vkazivnikiv vihid za mezhi bufera tosho Rust pidtrimuye sumish imperativnih procedurnih i ob yektno oriyentovanih metodiv z takimi paradigmami yak funkcijne programuvannya i model aktoriv a takozh uzagalnene programuvannya i metaprogramuvannya u statichnih i dinamichnih stilyah Sintaksis ta osoblivostiOsoblivosti movi Osnovni mozhlivosti movi Zoseredzhennya na bezpeku Dbala robota z pam yattyu zhodnih nulovih i zavislih vkazivnikiv Avtomatichne keruvannya pam yattyu bez zbiracha smittya samimi garantiyami kompilyatora kontroler pozichan Kontrol minlivosti Ob yekti ustaleno neminlivi angl immutable Bezpeka dinamichnogo vikonannya obrobka zboyiv vinyatki vedennya logu RAII dtors Typestate mozhlivist viznachennya skladnih invariantiv sho kontrolyuyut strukturi danih Zoseredzhennya na rivnochasnist i efektivnist kodu Yavne keruvannya pam yattyu keruvannya shemoyu rozpodilu pam yati Ukraj legki zadachi sho formuyutsya yak spivprogrami Legkist u porodzhenni tisyach i miljoniv pidprocesiv Iteratori steka faktichno lyambda bloki bez rozpodilu kupi Statichna nativna kompilyaciya zi stvorennyam vikonuvanih fajliv ELF en Mach O Pryamij i prostij interfejs dlya kodu na movi Si Zoseredzhennya na praktichne zastosuvannya Bagatoparadigmova funkcijna imperativno procedurna pidtrimka rivnobizhnoyi modeli aktoriv Funkciyi vishogo poryadku zi zv yazuvannyam Nemaye imennih tipiv chi iyerarhiyi tipiv Bagatoplatformna pidtrimuyetsya Windows Linux macOS BSD Zberigannya ryadkiv u UTF 8 riznomanitnist nizkorivnevih tipiv Pracyuye z nayavnimi nativnimi naborami instrumentiv GNU Debugger Valgrind Shark tosho Praktichna mozhlivist porushennya pravil mozhlivist nehtuvannya pravil bezpeki yaksho chitko vkazano koli i yak yih porushuvati Volodinnya i kontroler pozichan Viraznoyu osoblivistyu Rust ye sistema volodinnya danimi zabezpechena chastinoyu kompilyatora sho zvetsya kontrolerom pozichan angl borrow checker Pozichannyam zvetsya stvorennya posilannya Pravila volodinnya i pozichannya dani zavzhdi inicializovani u danih kozhnu mit mozhe buti lishe odin volodilec zminna pid chas znishennya volodilcya napriklad pid chas vihodu z oblasti vidimosti dani zvilnyayutsya na dani mozhe buti kilka neminlivih posilan na dani mozhe buti lishe odne minlive posilannya yaksho nemaye neminlivih Kontroler pozichan yavlyaye soboyu chi ne najskladnishe z chim dovoditsya stikatisya novim rozrobnikam Rust Vin zaboronyaye duzhe bagato praktik do yakih mozhna legko zviknuti v inshih movah programuvannya natomist vin zahishaye programista vid bagatoh poshirenih v inshih movah pomilok takih yak superechnosti v danih odna chastina programi ne mozhe yih zminiti koli na nih ye posilannya z inshoyi chastini zmina iterovanogo ob yekta pid chas iteraciyi gonitva danih i t d Risi Risi takozh inodi trejti tipazhi angl traits ye odniyeyu z viraznih osoblivostej Rust Risi zagalom nagaduyut interfejsi v movah programuvannya sho pidtrimuyut OOP i poznachayut spilnu povedinku riznih tipiv Tipi danih Prosti primitivni tipi Prosti primitivni tipi movi Rust Tip Opis Priklad i8 i16 i32 i64 i128 Znakovi cili chisla do 128 bit Chislo v nazvi tipu poznachaye rozmir u bitah 7 7i128 u8 u16 u32 u64 u128 Bezznakovi cili chisla do 128 bit Chislo v nazvi tipu poznachaye rozmir u bitah 14 14i128 isize usize Cili chisla rozmirom iz vkazivnik rozmir zalezhit vid platformi 14isize 2usize f32 f64 f128 Chisla z ruhomoyu komoyu 3f32 char Simvol zajmaye 4 bajti a 语 u 200D str Ryadkovij zriz Ryadki mayut koduvannya UTF 8 zi zminnim rozmirom simvolu tomu do nih nemozhlivo zvertatisya za indeksom Chasto zustrichayetsya u svoyij pozichenij formi amp str Hello 3 bool Bulevij tip zajmaye 1 bajt true false T Zriz dinamichno zminyuvane predstavlennya v sumizhnij poslidovnosti 1 2 3 4 5 i Hello world as bytes vec 1 2 3 as slice en let x return 123 Skladeni tipi Skladeni tipi movi Rust Tip Opis Priklad T U Kortezh skinchenna neodnoridna poslidovnist Dostup do elementiv zdijsnyuyetsya cherez operator krapka z chislom napriklad tuple 0 nulovij element kortezhu Porozhnij kortezh en u Rust 5 T N Masiv kolekciya z N ob yektiv odnogo tipu T sho zberigayutsya v sumizhnij pam yati Indeksuvannya zdijsnyuyetsya cherez duzhkovij zapis napriklad array 0 i64 10 masiv z 10 chisel tipu i64 Tipi zi standartnoyi biblioteki Tipi zi standartnoyi biblioteki movi Rust Tip Opis Priklad String Dinamichnij ryadok sho zberigaye dani v kupi String new String from Hello to string Option lt T gt en None Some 3 Some hello Result lt T E gt Obrobka pomilok Result Ok 3 Result Err something went wrong Vec lt T gt Vektor dinamichnij masiv Vec new vec 1 2 3 4 5 VecDeque Dvobichna cherga na osnovi ciklichnogo bufera let mut buf VecDeque new buf push back 3 buf push back 4 buf push back 5 assert eq buf get 1 Some amp 4 LinkedList lt T gt Zv yazanij spisok let mut my list LinkedList new my list push back b my list push back c HashMap lt K V gt Gesh tablicya let mut player stats HashMap new player stats insert damage 1 player stats entry health or insert 100 BTreeMap lt K V gt B derevo let mut solar distance BTreeMap from Mercury 0 4 Venus 0 7 solar distance entry Earth or insert 1 0 HashSet Mnozhina na osnovi gesh tablici let mut books HashSet new books insert A Dance With Dragons to string books insert To Kill a Mockingbird to string books insert The Odyssey to string BTreeSet Mnozhina na osnovi B dereva let mut planets BTreeSet new planets insert Mars planets insert JUpiter BinaryHeap Dvijkova kupa let mut heap BinaryHeap new heap push 1 heap push 5 heap push 2 Vkazivniki Vkazivnikovi ta posilalni tipi movi Rust Tip Opis Priklad amp T amp mut T Posilannya neminlivi ta minlivi let x ref amp x let x ref amp mut x const T mut T Vkazivniki neminlivi ta minlivi Rozimenuvannya vkazivnika ye nebezpechnoyu unsafe operaciyeyu let x ptr amp x as const T let x ptr amp mut x as mut T Viznacheni koristuvachem tipi Viznacheni koristuvachem tipi movi Rust Tip Opis struct Struktura union Ob yednannya vidpovidnik ob yednannya C de vsi elementi roztashovani v odnomu misci v pam yati Oskilki kompilyator ne mozhe garantuvati potochnij stan ob yednannya zvertatisya do jogo poliv nebezpechna unsafe operaciya enum Perelichuvanij tip Shozhij na union ale kompilyator garantuye kontrol za stanom Ukraj viraznij zavdyaki movnij konstrukciyi zistavlyannya iz vzircemPrikladiNavedeni nizhche prikladi ye robochimi pid chas zbirannya za dopomogoyu stabilnoyi versiyi kompilyatora Rust 1 63 0 vidannya 2021 Hello world fn main println hello world Tri versiyi realizaciyi funkciyi poshuku faktoriala u rekursivnomu ta iterativnomu sposobah Umovna instrukciya sho pokazuye mozhlivist neyavnogo povernennya znachennya implicit return Na vidminu vid C i shozhih mov u Rust instrukciya if naspravdi ye virazom i mozhe povertati znachennya Yaksho u funkciyi ne vkazano yavnogo return povertayetsya ostannye znachennya v tili funkciyi fn recursive factorial n u32 gt u32 if n lt 1 1 else n recursive factorial n 1 fn iterative factorial n u32 gt u32 Zminni ogoloshuyutsya klyuchovim slovom let Klyuchove slovo mut robit zminni minlivimi dozvolyaye zminyuvatisya let mut i 1 u32 let mut result 1 u32 while i lt n result i i 1 return result Yavne povernennya znachennya na vidminu vid poperednoyi funkciyi fn iterator factorial n u32 gt u32 Iteratori mayut bagato metodiv dlya trasformaciyi accum x viznachaye anonimnu funkciyu Optimizaciyi na kshtalt vbuduvannya tila funkciyi dozvolyayut intervalu i fold dosyagati produktivnosti podibnoyi do iterative factorial 1 n fold 1 accum x accum x fn main println Recursive result recursive factorial 10 println Iterative result iterative factorial 10 println Iterator result iterator factorial 10 Pokaz vbudovanih u Rust unikalnih rozumnih vkazivnikiv razom z en ta metodami use IntList Node Empty Cya programa viznachaye rekursivnu strukturu danih ta realizuye dlya neyi metodi Rekursivni strukturi danih potrebut sharu rozimenuvannya yakij tut zabezpechuyetsya unikalnim vkazivnikom pobudovanim za dopomogoyu konstruktora Box new Voni analogichni bibliotechnomu tipu C std unique ptr hocha j mayut bilshe statichnih garantij bezpeki fn main let list IntList new prepend 3 prepend 2 prepend 1 println Sum of all values in the list list sum println Sum of all doubled values in the list list multiply by 2 sum enum viznachaye tip sumu sho mozhe buti odnim z dekilkoh riznih vidiv znachen pid chas vikonannya Tut tip abo ne mistitime znachennya abo mistitime znachennya i vkazivnik na inshij IntList enum IntList Node i32 Box lt IntList gt Empty Blok impl dozvolyaye viznachati metodi dlya tipu impl IntList fn new gt Box lt IntList gt Box new Empty fn prepend self value i32 gt Box lt IntList gt Box new Node value Box new self fn sum amp self gt i32 Virazi match ye tipovim sposobom zastosuvannya zistavlennya iz vzircem i desho shozhi na instrukciyu switch iz C ta C match self Node value ref next gt value next sum Empty gt 0 fn multiply by amp self n i32 gt Box lt IntList gt match self Node value ref next gt Box new Node value n next multiply by n Empty gt Box new Empty Prostij pokaz legkovagih mozhlivostej rivnochasnosti Rust Cya funkciya stvoryuye desyat rivnochasno vikonuvanih nitok Dlya perevirki mozhete zapustiti programu kilka raziv i pobachiti zminu poryadku u yakomu vivodyatsya povidomlennya riznih nitej fn main Cej ryadok neminlivij i tomu rizni nitki mozhut otrimuvati dostup do nogo let greeting Hello Funkciya scope stvoryuye nitki sho ne budut znisheni do kincya svoyeyi roboti argument anonimnoyi funkciyi ob yekt tipu Scope yakij i trimatime nitki std thread scope s for num in 0 10 move viznachaye zahoplennya za znachennyam s spawn move println ce makros sho formuye vivedennya za formatnim ryadkom pid chas kompilyaciyi Makrosi v Rust strukturni yak u Scheme a ne tekstovi yak u C println greeting from thread number num Ukrayinska spilnota RustIsnuye i zhvavo rozvivayetsya ukrayinska gilka Rust spilnoti Metoyu spilnoti ye populyarizaciya Rust v Ukrayini j rozvitok spilnoti navkolo nogo zapusk abo spriyannya rozvitku vseukrayinskih mentorskih i osvitnih program zaluchennya proyektiv na Rust ta pov yazanih z nimi investicij v Ukrayinu Stvoreno pidbirku navchalnih materialiv zavershuyetsya robota nad perekladom pidruchnika koli PrimitkiAnnouncing Rust 1 79 0 13 cherven 2024 Procitovano 14 cherven 2024 COPYRIGHT Rust compiler source repository Procitovano 17 grudnya 2012 14 veresnya 2010 Arhiv originalu za 20 lipnya 2020 Procitovano 17 kvitnya 2012 Future Tense 29 kvitnya 2011 Arhiv originalu za 18 veresnya 2012 Procitovano 17 kvitnya 2012 At Mozilla Summit 2010 we launched Rust a new programming language motivated by safety and concurrency for parallel hardware the manycore future which is upon us Hello World Rust Foundation angl 8 lyutogo 2020 originalu za 19 kvitnya 2022 Procitovano 4 chervnya 2022 Hoare Graydon 7 chervnya 2014 Reddit com Arhiv originalu za 14 lipnya 2016 Procitovano 4 lyutogo 2018 Hoare Graydon 2 zhovtnya 2010 Rust Progress Arhiv originalu za 18 veresnya 2012 Procitovano 17 kvitnya 2012 Hoare Graydon 20 kvitnya 2011 Arhiv originalu za 20 lipnya 2011 Procitovano 17 kvitnya 2012 After that last change fixing the logging scope context bug looks like stage1 rustc builds Just shy of midnight Arhiv originalu za 15 travnya 2015 Procitovano 16 travnya 2015 Ars Technica Arhiv originalu za 16 grudnya 2016 Procitovano 24 zhovtnya 2015 dou ua Arhiv originalu za 12 chervnya 2022 Procitovano 13 veresnya 2022 PosilannyaOficijnij sajt Rust Language Wiki 10 lyutogo 2014 u Wayback Machine Elektronnij arhiv email listuvannya Rust dev 14 bereznya 2012 u Wayback Machine Osnovnij repozitorij vihidnih tekstiv ta bag treker 3 veresnya 2013 u Wayback Machine