Начало работы
Hello_World.rs
``rust fn main() { println!(“Hello, World!”); }
#### Компиляция и запуск
``Оболочка
$ rustc Hello_World.rs
$ ./Hello_World
Привет, мир!
Примитивные типы
bool |
Boolean (true / false ) |
char |
символ |
f32 , f64 |
|
i64 , i32 , i16 , i8 |
подписанные 16- … целые числа |
u64 , u32 , u16 , u8 |
|
isize |
|
usize |
целые беззнаковые числа с размером указателя |
См: Rust Types
Форматирование
``rust {.wrap} // Одиночный заполнитель println!("{}", 1);
// Множественный плейсхолдер println!("{} {}", 1, 3);
// Позиционные аргументы println!("{0} - это {1} {2}, также {0} является {3} языком программирования", “Rust”, “cool”, “language”, “safe”);
// Именованные аргументы println!("{страна} - это многообразная нация, обладающая единством.", страна = “Индия”);
// Черты-заместители :b - двоичная система счисления, :0x - шестнадцатеричная система счисления, :o - восьмеричная система счисления println!(“Выведем 76 - двоичное число, которое равно {:b} , шестнадцатеричный эквивалент - {:0x} и восьмеричный эквивалент - {:o}”, 76, 76, 76);
// Отладочный тракт println!(“Выведем сюда все, что хотим, используя отладочный признак {:?}”, (76, ‘A’, 90));
// Новые строки формата в 1.58 let x = “world”; println!(“Hello {x}!”);
### Стили печати
```rust
// Печать вывода
print!("Hello World\n");
// Добавляет новую строку после печати
println!("Добавление новой строки");
// Печатается как ошибка
eprint!("Это ошибка\n");
// Печатается как ошибка с новой строкой
eprintln!("Это ошибка с новой строкой");
Переменные
// Инициализация и объявление переменной
let some_variable = "This_is_a_variable";
// Делаем переменную мутабельной
let mut mutable_variable = "Mutable";
// Присвоение нескольких переменных
let (name, age) = ("ElementalX", 20);
// (Глобальная) константа
const SCREAMING_SNAKE_CASE:i64 = 9;
Комментарии
``rust // Комментарии к строкам /*………….Block Comments */ /// Внешние комментарии к документу //! Внутренние комментарии к документам
См: [Comment](https://doc.rust-lang.org/reference/comments.html)
### Функции
``rust
fn test(){
println!("Это функция!");
}
fn main(){
test();
}
См: Функции
Типы Rust
Integer
``rust let mut a: u32 = 8; let b: u64 = 877; let c: i64 = 8999; пусть d = -90;
### Плавающая точка
``rust
let mut sixty_bit_float: f64 = 89.90;
let thirty_two_bit_float: f32 = 7.90;
let just_a_float = 69.69;
Boolean
let true_val: bool = true;
let false_val: bool = false;
let just_a_bool = true;
let is_true = 8 < 5; // => false
Character
let first_letter_of_alphabet = 'a';
let explicit_char: char = 'F';
let implicit_char = '8';
let emoji = "\u{1f600}"; // => 😀
Строковый литерал
let community_name = "AXIAL";
let no_of_members: &str = "10";
println!("Название сообщества - {имя_сообщества} и в нем {no_of_members} членов");
См: Строки
Массивы
``rust ┌─────┬─────┬─────┬─────┬─────┬─────┐ | 92 | 97 | 98 | 99 | 98 | 94 | └─────┴─────┴─────┴─────┴─────┴─────┘ 0 1 2 3 4 5
----
``rust
пусть массив: [i64; 6] = [92,97,98,99,98,94];
Многомерный массив
``Руст j0 j1 j2 j3 j4 j5 ┌────┬────┬────┬────┬────┬────┐ i0 | 1 | 2 | 3 | 4 | 5 | 6 | ├────┼────┼────┼────┼────┼────┤ i1 | 6 | 5 | 4 | 3 | 2 | 1 | └────┴────┴────┴────┴────┴────┘
----
``rust
пусть массив: [[i64; 6] ;2] = [
[1,2,3,4,5,6],
[6,5,4,3,2,1]];
Mutable Array
``rust let mut array: [i32 ; 3] = [2,6,10];
array[1] = 4; array[2] = 6;
Для того чтобы сделать его мутабельным, используйте ключевое слово `mut`.
### Slices
``rust
пусть mut array: [ i64; 4] = [1,2,3,4];
let mut slices: &[i64] = &array[0..3] // Нижний диапазон - включительно, верхний - исключительно
println!("The elements of the slices are : {slices:?}");
Векторы
``Руст пусть some_vector = vec![1,2,3,4,5];
Вектор объявляется с помощью макроса `vec!`.
### Кортежи
``rust
let tuple = (1, 'A' , "Cool", 78, true);
Строки Rust
Строковый литерал
``rust let cs:&str = “шпаргалка”;
// => Поделиться шпаргалкой для разработчиков println!(“Поделиться {cs} для разработчиков”);
### Строковый объект
```rust
// Создание пустого строкового объекта
let my_string = String::new;
// Преобразование в строковый объект
let S_string = a_string.to_string()
// Создание инициализированного строкового объекта
let lang = String::from("Rust");
println!("Первый язык - {lang}");
.capacity()
``rust let rand = String::from(“Случайная строка”); rand.capacity() // => 13
Вычисляет емкость строки в байтах.
### .contains()
``rust
let name = String::from("ElementalX");
name.contains("Element") // => true
Проверяет, содержится ли подстрока внутри исходной строки или нет.
Вставка одного символа
``rust let mut half_text = String::from(“Hal”); half_text.push(‘f’); // => Half
### Толкание целой строки
``rust
let mut hi = String::from("Привет...");
hi.push_str("Как дела??");
// => Привет... Как дела?
println!("{hi}");
Операторы Rust
Операторы сравнения
e == f |
e равно f |
e != f |
e НЕ равно f |
e < f |
e меньше, чем f |
e > f |
e больше f |
e <= f |
e меньше или равно f |
e >= f |
e больше или равно f |
``rust пусть (e, f) = (1, 100);
let greater = f > e; // => true let less = f < e; // => false let greater_equal = f >= e; // => true let less_equal = e <= f; // => true let equal_to = e == f; // => false let not not_equal_to = e != f; // => true
### Арифметические операторы
| | |
|----------|--------------------------------------------|
| `a + b` | `a` прибавляется к `b` |
| | `a - b` | `b` вычитается из `a` |
| | `a / b` | `a` делится на `b` |
| | `a % b` | Получение остатка от `a` путем деления на `b` |
| `a * b` | `a` умножается на `b` |
------
``rust {.wrap}
пусть (a, b) = (4, 5);
let sum: i32 = a + b; // => 9
let вычитание: i32 = a - b; // => -1
let умножение: i32 = a * b; // => 20
let деление: i32 = a / b; // => 0
let modulus: i32 = a % b; // => 4
Побитовые операторы
Оператор | Описание |
---|---|
g & h |
Двоичное И |
`g | h` |
g ^ h |
Двоичное XOR |
g ~ h |
|
g << h |
Двоичный сдвиг влево |
g >> h |
Двоичный сдвиг вправо |
``rust {.wrap} пусть (g, h) = (0x1, 0x2);
let bitwise_and = g & h; // => 0 let bitwise_or = g | h; // => 3 let bitwise_xor = g ^ h; // => 3 let right_shift = g » 2; // => 0 let left_shift = h « 4; // => 32
### Логические операторы
| Пример | Значение |
|----------------|------------------------|
| `c && d` | Оба истинны _(AND)_ |
| `c || d` | Любое из них истинно _(OR)_ |
| `!c` | `c` ложно _(NOT)_ |
------
``rust
пусть (c, d) = (true, false);
let and = c && d; // => false
let or = c || d; // => true
let not = !c; // => false
Составной оператор присваивания
``Руст let mut k = 9; let mut l = k;
----
| Оператор | Описание |
|-----------|-----------------------------------------|
| `k += l` | Добавить значение и присвоить, тогда k=9 |
| `k -= l` | Вычесть значение и присвоить, тогда k=18 |
| `k /= l` | Разделить значение и присвоить, тогда k=9 |
| `k *= l` | Умножить значение и присвоить, тогда k=81 |
| `k |= l` | Побитовое ИЛИ и присвоение, тогда k=89 |
Регулятор расхода ржавчины
--------------
### Выражение If
``rust
let case1: i32 = 81;
let case2: i32 = 82;
if case1 < case2 {
println!("case1 больше case2");
}
Выражение If…Else
``Руст let case3 = 8; пусть case4 = 9;
if case3 >= case4 { println!(“case3 лучше, чем case4”); } else { println!(“case4 больше, чем case3”); }
### If...Else...if...Else Expression
``Руст
let foo = 12;
let bar = 13;
if foo == bar {
println!("foo равно bar");
} else if foo < bar {
println!("foo меньше bar");
} else if foo != bar {
println!("foo не равно bar");
} else {
println!("Ничего");
}
Если… Пусть выражение
``rust let mut arr1:[i64 ; 3] = [1,2,3]; if let[1,2,_] = arr1{ println!(“Работает с массивом”); }
let mut arr2:[&str; 2] = [“один”, “два”]; if let[“Apple”, _] = arr2{ println!(“Работает и с массивом str”); }
----
``rust
let tuple_1 = ("Индия", 7, 90, 90.432);
if let(_, 7, 9, 78.99) = tuple_1{
println!("Работает и с кортежами");
}
let tuple_2 = ( 9, 7, 89, 12, "Хорошо");
if let(9, 7,89, 12, blank) = tuple_2 {
println!("Все {blank} совпало?");
}
let tuple_3 = (89, 90, "Да");
if let(9, 89, "Да") = tuple_3{
println!("Шаблон совпал");
}
else {
println!("Шаблон не совпал");
}
Выражение соответствия
``rust let day_of_week = 2; match day_of_week { 1 => { println!(“Это понедельник, чуваки”); }, 2 => { println!(“Сегодня вторник, мои чуваки”); }, 3 => { println!(“Сегодня среда, мои чуваки”); }, 4 => { println!(“Сегодня четверг, мои чуваки”); }, 5 => { println!(“Сегодня пятница, мои чуваки”); }, 6 => { println!(“Сегодня суббота, мои чуваки”); }, 7 => { println!(“Сегодня воскресенье, мои чуваки”); }, _ => { println!(“По умолчанию!”) } };
### Вложенное... выражение If
``rust
пусть nested_conditions = 89;
if nested_conditions == 89 {
let just_a_value = 98;
if just_a_value >= 97 {
println!("Больше 97");
}
}
For Loop
for mut i in 0..15 {
i-=1;
println!("Значение i равно : {i}");
}
Цикл While
``rust let mut check = 0; while check < 11{ println!(“Check is : {check}”); check+=1; println!(“После инкрементирования: {check}”);
if check == 10{ break; // stop while } }
### Ключевое слово Loop
``Руст
цикл {
println!("hello world forever!");
}
Указанный бесконечный цикл.
Заявление Break
``Раст let mut i = 1; цикл { println!(“i равно {i}”); if i > 100 { break; } i *= 2; }
### Continue Statement
```rust
for (v, c) in (0..10+1).enumerate(){
println!("Цикл перебора чисел {c}");
if v == 9{
println!("Продолжаем?");
continue;
}
println!{"Значение v равно : {v}"}
}
Функции Rust
Базовая функция
``Руст
fn print_message(){ println!(“Привет, CheatSheets.zip!”); }
fn main(){ //Вызов функции в Rust. print_message(); }
### Передача по значению
``rust
fn main()
{
let x:u32 = 10;
let y:u32 = 20;
// => 200
println!("Calc: {}", cal_rect(x, y));
}
fn cal_rect(x:u32, y:u32) -> u32
{
x * y
}
Передача по ссылке
``rust fn main(){ let mut by_ref = 3; // => 3 power_of_three(&mut by_ref); println!("{by_ref}"); // => 9 }
fn power_of_three(by_ref: &mut i32){ // отмена ссылок важна *by_ref = *by_ref * *by_ref; println!("{by_ref}"); // => 9 }
### Возвраты
``rust {.wrap}
fn main(){
let(mut radius, mut pi) = (3.0, 3.14);
let(area, _perimeter) = calculate (
&mut radius,
&mut pi
);
println!("Площадь и периметр круга равны: {area} & {_периметр}");
}
fn calculate(radius : &mut f64, pi: &mut f64) -> (f64, f64){
let perimeter = 2.0 * *pi * *radius;
let area = *pi * *radius * *radius;
return (area, perimeter);
}
Массивы в качестве аргументов
``rust fn main(){ let mut array: [i32 ; 5] = [1,2,3,4,6]; print_arrays(array); println!(“Элементы: {array:?}”); }
fn print_arrays(mut array:[i32; 5]) { array[0] = 89; array[1] = 90; array[2] = 91; array[3] = 92; array[4] = 93; println!(“Элементы: {array:?}”); }
### Возврат массивов
``rust
fn main(){
let mut arr:[i32; 5] = [2,4,6,8,10];
multiply(arr);
println!("Массив равен : {:?}", multiply(arr));
}
fn multiply (mut arr: [i32 ; 5]) -> [i32 ; 5]{
arr[2] = 90;
for mut i in 0..5 {
arr[i] = arr[i] * arr[2];
}
return arr;
}
Разное
Type Casting
``Руст let a_int = 90; // int // int to float let mut type_cast = (a_int as f64);
------
``rust
let orginal: char = 'I';
// char to int => 73
let type_casted: i64 = orginal as i64;
Для выполнения приведения типов в Rust необходимо использовать ключевое слово as
.
Заимствование
``Рост let mut foo = 4; let mut borrowed_foo = &foo; println!("{borrowed_foo}");
------
``rust
let mut bar = 3;
let mut mutable_borrowed_bar = &mut bar;
println!("{mutable_borrowed_bar}");
Здесь заимствованное значение заимствует значение из значения один с помощью оператора &
.
Отмена ссылки
``rust let mut borrow = 10; let deref = &mut borrow;
println!("{}", *deref);
Отмена ссылок в rust может быть выполнена с помощью оператора `*`
### Область видимости переменных
``rust
{
// Область видимости, ограниченная этой скобкой
let a_number = 1;
}
println!("{a_number}");
Это приведет к ошибке, так как область видимости переменной a_number
заканчивается на скобках
Также см.
- The Rust Document (doc.rust-lang.org)
- The Rust Reference (doc.rust-lang.org)
- Rust Cheatsheet (phaiax.github.io)