1. Введение в Rust: настройка окружения, переменные и базовые типы данных
Введение в Rust: настройка окружения, переменные и базовые типы данных
Добро пожаловать в курс «Основы и тонкости программирования на Rust». Мы начинаем наше путешествие с фундамента, на котором строится всё здание этого языка. Rust — это системный язык программирования, который сочетает в себе производительность C++ с безопасностью памяти и современными инструментами разработки. Он не просто предотвращает ошибки, он меняет сам подход к написанию кода.
В этой статье мы пройдем путь от установки инструментов до написания первых строк кода, разберем, как Rust хранит данные, и узнаем, почему переменные в этом языке ведут себя немного иначе, чем вы могли привыкнуть.
Почему Rust?
Прежде чем открыть терминал, стоит понять, зачем вообще изучать Rust. Основная идея языка заключается в гарантии безопасности памяти без использования сборщика мусора (Garbage Collector). Это достигается благодаря уникальной системе владения (ownership), которую мы разберем в следующих уроках.
Rust позволяет писать код, который:
Настройка окружения
Для разработки на Rust нам понадобится несколько инструментов. К счастью, они устанавливаются одним пакетом.
Установка через rustup
Основной способ установки Rust — использование утилиты rustup. Это инсталлятор и менеджер версий языка.
Для Linux и macOS: Откройте терминал и введите следующую команду:
Для Windows:
Перейдите на официальный сайт Rust и скачайте rustup-init.exe.
После установки у вас появятся три ключевых инструмента:
* rustc: компилятор, который превращает ваш код в исполняемый файл.
* cargo: менеджер пакетов и система сборки. Вы будете использовать его в 99% случаев.
* rustup: утилита для обновления самого Rust и управления его версиями.
Чтобы проверить, что всё установилось корректно, введите в терминале:
Если вы видите номер версии, значит, мы готовы двигаться дальше.
Ваш первый проект с Cargo
Хотя можно компилировать файлы напрямую через rustc, в реальной жизни так никто не делает. Мы будем использовать cargo. Давайте создадим новый проект.
Эта команда создает директорию hello_rust со следующей структурой:
* Cargo.toml: файл манифеста, где описываются метаданные проекта и его зависимости (аналог package.json в JS или pom.xml в Java).
* src/main.rs: исходный код вашей программы.
Откройте файл src/main.rs. Вы увидите классический пример:
Давайте разберем этот код:
fn main() { ... }: объявление функции. main — это точка входа в любую программу на Rust. Код внутри фигурных скобок выполняется первым.println!("Hello, world!"): это вызов макроса, а не функции. На это указывает восклицательный знак !. Макросы в Rust — это мощный инструмент метапрограммирования, который генерирует код во время компиляции. В данном случае он выводит текст в консоль.;: каждая инструкция должна заканчиваться точкой с запятой.Чтобы запустить программу, выполните:
Эта команда скомпилирует проект (если были изменения) и сразу запустит его.
Переменные и неизменяемость
Здесь начинается самое интересное. В большинстве языков переменные по умолчанию можно изменять. В Rust переменные неизменяемы (immutable) по умолчанию.
Попробуйте написать такой код:
Компилятор выдаст ошибку: cannot assign twice to immutable variable x. Это сделано намеренно, чтобы избежать ошибок, связанных с неожиданным изменением состояния программы.
Ключевое слово mut
Если вы хотите, чтобы переменную можно было менять, нужно явно сообщить об этом компилятору, используя ключевое слово mut:
Теперь код скомпилируется и выполнится успешно.
Затенение (Shadowing)
В Rust есть интересная особенность: вы можете объявить новую переменную с тем же именем, что и предыдущая. Это называется затенением.
В этом примере мы трижды используем let. Каждый раз мы создаем новую переменную x, которая «затеняет» предыдущую. В итоге программа выведет 12.
В чем отличие от mut?
let, поэтому создаем новую переменную.С mut такое невозможно, так как тип переменной фиксируется при создании.
Базовые типы данных
Rust — язык со статической типизацией. Это значит, что компилятор должен знать тип всех переменных во время компиляции. Часто он может вывести тип сам (как в примерах выше), но иногда ему нужно помочь.
Типы данных делятся на две группы: скалярные и составные.
Скалярные типы
Скалярный тип представляет собой одно значение. В Rust их четыре группы.
#### 1. Целые числа (Integers)
Числа без дробной части. Они могут быть знаковыми (i — signed) и беззнаковыми (u — unsigned).
| Размер | Знаковый | Беззнаковый |
| :--- | :--- | :--- |
| 8-bit | i8 | u8 |
| 16-bit | i16 | u16 |
| 32-bit | i32 | u32 |
| 64-bit | i64 | u64 |
| 128-bit | i128 | u128 |
| Arch | isize | usize |
* По умолчанию Rust использует i32.
* Типы isize и usize зависят от архитектуры вашего компьютера (32 или 64 бита). Они часто используются для индексации коллекций.
#### 2. Числа с плавающей точкой (Floating-Point)
Числа с дробной частью. В Rust их два:
* f32: 32 бита.
* f64: 64 бита (по умолчанию, так как на современных процессорах он работает почти с той же скоростью, что и f32, но дает большую точность).
#### 3. Логический тип (Boolean)
Имеет два значения: true и false. Занимает 1 байт памяти. Используется в условных операторах.
#### 4. Символьный тип (Character)
Тип char в Rust — это не просто 1 байт (как в C). Это 4 байта, представляющие скалярное значение Unicode. Это значит, что char может хранить кириллицу, иероглифы и даже эмодзи.
> Обратите внимание: символы (char) пишутся в одинарных кавычках, а строки — в двойных.
Составные типы
Составные типы могут объединять несколько значений в одно.
#### Кортежи (Tuples)
Кортеж — это способ сгруппировать несколько значений разных типов. Кортежи имеют фиксированную длину.
!Схема структуры кортежа, показывающая, что он хранит элементы разных типов единым блоком.
#### Массивы (Arrays)
В отличие от кортежа, каждый элемент массива должен иметь один и тот же тип. Массивы в Rust имеют фиксированную длину.
Массивы полезны, когда вы хотите разместить данные в стеке (stack), а не в куче (heap), или когда вы точно знаете количество элементов (например, названия месяцев).
Доступ к элементам массива осуществляется по индексу:
Если вы попытаетесь обратиться к индексу за пределами массива, Rust выдаст ошибку времени выполнения (panic). Это еще один пример безопасности языка.
Заключение
Мы настроили окружение, написали первую программу и разобрались с базовыми кирпичиками данных в Rust. Вы узнали, что переменные неизменяемы по умолчанию, что char — это Unicode-символ, и что массивы имеют фиксированный размер.
В следующей статье мы углубимся в одну из самых сложных, но важных тем: функции и управление потоком выполнения. А пока — выполните домашнее задание, чтобы закрепить материал.