У rust синтаксис похож с языком программирования как c++. У rust также как и с++ точкой входа в программу является функция main. Она всегда вызывается автоматически первым.
синтаксис:
fn main() { }
{} внутри фигурных скобок область видимости функции.
Чтобы вывести что либо на консоль нужно использовать макрос println!("Hello world");. Если в конце какого либо названия есть восклицательный знак, то это макрос. В макрос передается аргумент, который макросы выведет. И в конце команды должна быть точка с запятой. Чтобы вывести какую любо переменную нужно первым аргументом отправить "{}" а дальше через запятую то что хотим вывести
Переменные и изменяемость
В rust переменные по умолчанию не изменяемые (immutable).
let x = 5;
Чтобы создать переменную нужно использовать ключевое слово let, за тем название переменной и дальше через равно значение.
x = 4;
Если мы попытаемся изменить его то компилятор выведет ошибку.
Мы можем его сделать изменяемой
let mut x = 5;
Ключевое слово mut делает переменную изменяемой.
В этом случаи мы можем изменить x, а компилятор нам не выведет ошибку. x = 4;
Константы
Константы объявляются через ключевое слово const
const one: u8 = 1;
Тип хранимый в нем должен быть явно указан. К константам нельзя применить ключевое слово mut. Они всегда неизменяемые.
Константы можно объявить в любой области видимости, и в глобальной.
Затенение переменных
Можно объявить переменную с тем же именем которое было использовано раньше и такая новая переменная затеняет предыдущую.
let x = 5;
let x = x + 4;
let x = x * x;
Разница в том что мы не используем ключевое слово mut, let, в том, что мы создаем совсем новую переменную, которая может быть другим типом.
Пример:
let s = "hello";
let s = s.len();
Здесь s равна строке. но в новом s будет равна числу.
Если было бы
let mut s = "hello";
s = s.len();
то компилятор вывел бы ошибку.
Типы данных
Любые значения являются определенным типом данных. Rust является статически типизированным языком программирования. Он должен знать типы всех переменных во время компиляции. Иногда нам требуется вручную аннотировать переменную, например, когда нам нужно конвертировать строку в число:
let num: i32 = "523".parse().expect("Error")
Скалярные типы данных
Скалярные типы представляют с собой единственное значение. В rust есть целые числа, числа с плавающей точкой, логический тип и символы.
Целые числа: в rust есть много целочисленных типов: знаковые это i8, i16, i32, i64, i128, isize и без знаковые u8, u16, u32, u64, u128, usize. Каждый знаковый тип может хранить от -(2^(n - 1)) до (2^(n -1)) - 1, n - количество используемых бит.
тип size зависит от операционной системы, размер size равен 64 бит если операционная система использует 64-битную архитектуру, если 32- битную архитектуру то размер size равен 32.
Числовые литералы:
1. десятичные 1415, 100_000, можно использовать _ для удобства.
2. шестнадцатеричный 0xff
3. восьмеричный 0o77
4. двоичный 0b1111_0000
5. байтовый(только u8) b'A'
По умолчанию для целых числе используется тип i32. Этот тип самый быстры.
Числа с плавающей точкой
В rust есть два типа с плавающей точкой f32 и f64, по умолчанию используется f64, так как его скорость почти такая же как и у f32 но f64 точнее.
Rust поддерживает базовые математические операции: сумма, вычитание, умножение, деление, остаток от деления
let sum = 15 + 1;
let difference= 9.5 - 0.3;
let product =30 * 30;
let quotient = 6.7 / 3.2;
let remainder = 43 % 3;
Логический тип
Логический тип имеет два значения true и false, его размер 1 байт. Логический тип аннотируется с помощью ключевого слова bool.
let x: bool = true;
let y = false;
Символьный тип
Тип char используется для обозначения символов, например, букв.
Он имеет размер 4 байта.
let x = 'A';
Сложные типы данных
Кортеж. Кортежи являются способом объединения в группу значения с разными типами. Кортежи имеют фиксированную длину, ну могут расти и уменьшаться. Пример кортежа:
let tuple: (i32, bool, f32) = (124, true, 6.5);
Также можно распаковать кортеж
синтаксис:
let (x, y, z) = tuple;
это процесс называется деструктуризацией.
Для того чтобы получить элемент кортежа нужно обратится к нему через индекс. У первого элемента индекс 0 и тд.
println!("{}" tuple.0);
Массивы. В отличии от кортежа, элементы массива имею одинаковый тип. У него фиксированный размер.
let massiv = [1,2,3,4,5];
Массив бывает полезным когда мы хотим данные разместить в стеке.
Также можно аннотировать массив.
let massiv: [i32; 5] = [1,2,3,4,5];
Массив можно вывести так
println!("{:?}", massiv);
let mas = [3; 5];
Заметьте если в массиве через точку запятой отделены значения то это будет так 2 значение указывает на количество элементов в массиве, а первое каким элементом будет заполнено, в данном случаи [3,3,3,3,3].
Доступ к элементам массива происходит также через индекс, но индекс нужно указывать в квадратных скобочках.