Ръководство за начинаещи в Rust: От игри до програмиране, бързо опознаване на екосистемата на Rust
Ръководство за начинаещи в Rust: От игри до програмиране, бързо опознаване на екосистемата на Rust
Rust се развива бързо и е нещо повече от просто език за програмиране, той е и динамична екосистема. От игри за оцеляване до високопроизводително системно програмиране, Rust е навсякъде. Тази статия ще започне с дискусии в X/Twitter и ще предостави на начинаещите в Rust бързо ръководство за започване, обхващащо случаите на използване на Rust, ресурсите за обучение и някои практически инструменти.
I. Какво е Rust? Защо си струва да се научи?
Rust е език за системно програмиране, който се фокусира върху безопасността, скоростта и конкурентността. Той е предназначен да разреши често срещаните проблеми с безопасността на паметта в C и C++, като същевременно осигурява сравнима или дори по-висока производителност от тези езици.
Предимства на Rust:
- Безопасност на паметта: Системата за собственост и checker-ът за заемане на Rust могат да предотвратят проблеми като нулеви указатели и състезания на данни по време на компилация.
- Висока производителност: Rust се компилира в ефективен машинен код и има мощни възможности за абстракция с нулева цена.
- Безопасност при конкурентност: Типовата система на Rust може да гарантира безопасността на конкурентния код и да избегне състезания на данни.
- Кросплатформеност: Rust поддържа множество операционни системи и архитектури, включително Windows, Linux, macOS, WebAssembly и др.
- Активна общност: Rust има динамична общност, която предоставя богати библиотеки, инструменти и поддръжка.
Случаи на използване на Rust:
- Операционни системи и вградени системи: Поради високата си производителност и безопасност, Rust е много подходящ за разработване на ядра на операционни системи, драйвери и софтуер за вградени устройства.
- WebAssembly (Wasm): Rust може да бъде компилиран в Wasm, за да изпълнява високопроизводителен код в браузъри.
- Инструменти на командния ред: Rust предоставя мощни рамки за разработка на инструменти на командния ред, като
clapиstructopt. - Мрежово програмиране: Библиотеката
tokioна Rust предоставя асинхронна среда за изпълнение, което улеснява писането на високопроизводителни мрежови приложения. - Разработка на игри: Въпреки че не е толкова популярен като C++, Rust набира популярност в областта на разработката на игри, например играта за оцеляване с отворен код
Rustсама по себе си е разработена с Unity engine и C#, но част от логиката на сървъра може да бъде оптимизирана с Rust за производителност.
II. От играта Rust до езика за програмиране Rust
Дискусиите в X/Twitter споменаха играта за оцеляване Rust, която е тясно свързана с езика за програмиране Rust. Въпреки че използват едно и също име, те са различни неща. Играта Rust е мултиплейър онлайн игра за оцеляване, докато Rust е език за програмиране, използван за изграждане на различен софтуер.
Играта Rust:
- Е мултиплейър онлайн игра за оцеляване, в която играчите трябва да оцеляват в пустинята, да строят бази и да взаимодействат с други играчи.
- Разработена е с Unity engine и C#.
- Може да бъде закупена в Steam и често има промоции.
Езикът за програмиране Rust:
- Използва се за разработване на различен софтуер, включително операционни системи, браузърни двигатели, мрежови сървъри, игри и др.
- С отворен код и кросплатформен.
- Има мощна типова система и функции за безопасност на паметта.
Ако сте играч на играта Rust и искате да научите езика за програмиране Rust, можете да обмислите следните стъпки:
- Инсталирайте Rust toolchain: Изтеглете и инсталирайте
rustupот , той е инструмент за управление на версии на Rust. - Научете основите на Rust: Прочетете официалния урок "The Rust Programming Language" (известен като "The Book"), за да научите основния синтаксис на Rust, системата за собственост, checker-а за заемане и др.
- Практически проекти: Укрепете знанията си, като напишете прости инструменти на командния ред, уеб сървъри или игри.
- Участвайте в общността: Присъединете се към общността на Rust, общувайте с други разработчици на Rust и научете техния опит.## III. Изграждане на среда за разработка на Rust
Изграждането на среда за разработка на Rust е много лесно, просто трябва да инсталирате rustup. rustup автоматично ще инсталира Rust компилатора, стандартната библиотека и други необходими инструменти.
Стъпки:
- Изтегляне на
rustup: Посетете , изтеглете съответния инсталационен файл наrustupспоред вашата операционна система. - Изпълнение на инсталационния файл: Следвайте инструкциите на инсталационния файл.
- Конфигуриране на променливи на средата:
rustupавтоматично ще конфигурира променливите на средата, можете също да ги конфигурирате ръчно. - Проверка на инсталацията: Отворете терминал, изпълнете
rustc --versionиcargo --version, ако се покажат правилно номерата на версиите, това означава, че инсталацията е успешна.
Пример за код:
rustc --version # Вижте версията на Rust компилатора
cargo --version # Вижте версията на Cargo пакетния мениджър
IV. Бърз старт в основните синтактични правила на Rust
По-долу са някои от основните синтактични правила на Rust, които могат да ви помогнат бързо да започнете:
-
Деклариране на променливи:
let x = 5; // Неизменяема променлива let mut y = 10; // Изменяема променлива const PI: f64 = 3.1415926; // Константа -
Типове данни:
-
Целочислен тип:
i8,i16,i32,i64,i128,u8,u16,u32,u64,u128,isize,usize -
Тип с плаваща запетая:
f32,f64 -
Булев тип:
bool(true,false) -
Символен тип:
char(Unicode символ) -
Низ:
String,&str -
Кортеж:
(i32, f64, char) -
Масив:
[i32; 5] -
Срез:
&[i32] -
Структура:
struct Point { x: i32, y: i32, } -
Изброяване:
enum Color { Red, Green, Blue, }
-
-
Функции:
fn add(x: i32, y: i32) -> i32 { x + y } -
Управление на потока:
-
ifизраз:if x > 5 { println!("x is greater than 5"); } else if x == 5 { println!("x is equal to 5"); } else { println!("x is less than 5"); } -
loopцикъл:loop { println!("This will loop forever"); break; // Излизане от цикъла } ```## I. Въведение
-
Rust е модерен системен език за програмиране, фокусиран върху безопасност, скорост и паралелизъм. Той е подходящ за разработване на високопроизводителни приложения, операционни системи, инструменти за команден ред и уеб услуги. Това ръководство ще ви преведе през основите на Rust и ще ви помогне да започнете.
II. Инсталиране и настройка
-
Инсталиране на Rust:
-
Windows: Изтеглете и стартирайте
rustup-init.exeот https://www.rust-lang.org/tools/install. -
macOS и Linux: Отворете терминал и изпълнете командата:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
-
-
Настройка на променливите на средата:
След инсталацията,
rustupще добави Rust към вашата променлива на средатаPATH. Може да се наложи да рестартирате терминала си, за да влязат в сила промените. -
Проверка на инсталацията:
Отворете терминал и изпълнете командата:
rustc --version cargo --versionАко видите информация за версията, Rust е инсталиран успешно.
III. Основи на езика
-
Hello, World!
Създайте файл с име
main.rsи въведете следния код:fn main() { println!("Hello, World!"); }Запазете файла и изпълнете следните команди в терминала:
rustc main.rs ./mainЩе видите изхода
Hello, World!. -
Променливи и типове данни:
-
Променливи: В Rust променливите са неизменни по подразбиране. Използвайте
mut, за да ги направите изменяеми.let x = 5; // x е неизменна let mut y = 10; // y е изменяема y = 20; -
Типове данни: Rust е статично типизиран език, но често може да изведе типовете.
i32: 32-битово цяло число със знакf64: 64-битово число с плаваща запетаяbool: Булев тип (trueилиfalse)char: Единичен Unicode символString: Низ
let a: i32 = 10; let b: f64 = 3.14; let c: bool = true; let d: char = 'A'; let e: String = String::from("Hello");
-
-
Функции:
Функциите се дефинират с ключовата дума
fn.fn add(x: i32, y: i32) -> i32 { x + y } fn main() { let result = add(5, 3); println!("Result: {}", result); // Изход: Result: 8 } -
Управление на потока:
-
if/elseусловни оператори:let x = 5; if x > 0 { println!("x е положителен"); } else if x == 0 { println!("x е нула"); } else { println!("x е отрицателен"); } -
loopцикъл:loop { println!("Отново!"); break; // Излизане от цикъла } -
whileцикъл:let mut i = 0; while i < 5 { println!("i: {}", i); i += 1; } -
forцикъл:for i in 0..5 { // 0 до 4 println!("i: {}", i); } let arr = [1, 2, 3, 4, 5]; for element in arr.iter() { println!("element: {}", element); }
-
-
Собственост и заемане:
Rust използва система за собственост, за да управлява паметта. Всяка стойност има собственик и само един собственик може да има стойността в даден момент. Когато собственикът излезе от обхват, стойността се освобождава.
fn main() { let s1 = String::from("hello"); // s1 става собственик на низа let s2 = s1; // s1 премества собствеността към s2, s1 вече не е валиден // println!("{}", s1); // Грешка: стойността е преместена println!("{}", s2); // OK: s2 е собственикът }За да избегнете преместване на собствеността, можете да използвате заемане (borrowing).
fn main() { let s1 = String::from("hello"); let len = calculate_length(&s1); // Заемане на s1 println!("Дължината на '{}' е {}.",&s1, len); } fn calculate_length(s: &String) -> usize { s.len() } // s излиза от обхват, но не освобождава нищо, защото не е собственик -
Структури и изброявания:
-
Структури (structs):
struct User { username: String, email: String, sign_in_count: u64, active: bool, } fn main() { let user1 = User { email: String::from("someone@example.com"), username: String::from("someoneusername123"), active: true, sign_in_count: 1, }; println!("Username: {}", user1.username); } -
Изброявания (enums):
enum Movement { Up, Down, Left, Right, } fn move_avatar(m: Movement) { match m { Movement::Up => println!("Преместване нагоре"), Movement::Down => println!("Преместване надолу"), Movement::Left => println!("Преместване наляво"), Movement::Right => println!("Преместване надясно"), } } fn main() { move_avatar(Movement::Up); }
-
-
Съвпадение на шаблони (Pattern Matching):
matchе мощен оператор за съвпадение на шаблони.fn main() { let x = 5; match x { 1 => println!("one"), 2 => println!("two"), 3 => println!("three"), 4 => println!("four"), 5 => println!("five"), _ => println!("something else"), // _ е шаблон за улавяне на всичко } } -
Обработка на грешки:
Rust използва
Resultза обработка на грешки.use std::fs::File; use std::io::ErrorKind; fn main() { let f = File::open("hello.txt"); let f = match f { Ok(file) => file, Err(error) => match error.kind() { ErrorKind::NotFound => match File::create("hello.txt") { Ok(fc) => fc, Err(e) => panic!("Problem creating the file: {:?}", e), }, other_error => { panic!("Problem opening the file: {:?}", other_error) } }, }; }
IV. Разширени функции
-
Обобщения (Generics):
Обобщенията позволяват писането на код, който работи с множество типове данни.
fn largest<T: PartialOrd + Copy>(list: &[T]) -> T { let mut largest = list[0]; for &item in list.iter() { if item > largest { largest = item; } } largest } fn main() { let number_list = vec![34, 50, 25, 100, 65]; let result = largest(&number_list); println!("Най-голямото число е {}", result); let char_list = vec!['y', 'm', 'q', 'a']; let result = largest(&char_list); println!("Най-големият символ е {}", result); } -
Traits:
Traits са подобни на интерфейси в други езици. Те дефинират споделено поведение, което типовете могат да имплементират.
trait Summary { fn summarize(&self) -> String; } struct NewsArticle { headline: String, location: String, author: String, content: String, } impl Summary for NewsArticle { fn summarize(&self) -> String { format!("{}, от {} ({})", self.headline, self.author, self.location) } } struct Tweet { username: String, content: String, reply: bool, retweet: bool, } impl Summary for Tweet { fn summarize(&self) -> String { format!("{}:{}", self.username, self.content) } } fn main() { let article = NewsArticle { headline: String::from("Нова планета е открита!"), location: String::from("Небето"), author: String::from("Иван Иванов"), content: String::from("Учените откриха нова планета в далечна галактика."), }; println!("Нова статия: {}", article.summarize()); let tweet = Tweet { username: String::from("horse_ebooks"), content: String::from("хора, които обичат конете"), reply: false, retweet: false, }; println!("Нов туит: {}", tweet.summarize()); } -
Затваряния (Closures):
Затварянията са анонимни функции, които могат да улавят променливи от обкръжаващата ги среда.
fn main() { let x = 1; let add_one = |i: i32| i + x; println!("{}", add_one(2)); // Изход: 3 } -
Интелигентни указатели (Smart Pointers):
Интелигентните указатели са структури, които се държат като указатели, но също така предоставят допълнителни функции, като например автоматично управление на паметта.
Box: Заделяне на памет в хийпа.Rc: Множество собственици.RefCell: Вътрешна изменяемост.
use std::rc::Rc; fn main() { let a = Rc::new(String::from("hello")); let b = Rc::clone(&a); let c = Rc::clone(&a); println!("Брой препратки: {}", Rc::strong_count(&a)); // Изход: Брой препратки: 3 } -
Многонишкова обработка (Multithreading):
Rust предоставя безопасни и ефективни инструменти за многонишкова обработка.
use std::thread; use std::time::Duration; fn main() { let handle = thread::spawn(|| { for i in 1..10 { println!("Здравей от нишката номер {}!", i); thread::sleep(Duration::from_millis(1)); } }); for i in 1..5 { println!("Здравей от основната нишка номер {}!", i); thread::sleep(Duration::from_millis(1)); } handle.join().unwrap(); }Rust е език за програмиране, изпълнен с предизвикателства, но и изключително ценен. Той предлага мощна сигурност и производителност и има активна общност. Надяваме се, че чрез това въведение ще ви помогнем бързо да започнете с Rust и да започнете вашето Rust програмиране. От играта `Rust`, изследвайте мистериите на езика за програмиране Rust и ще откриете един съвсем нов свят.





