Типы данных в Rust
У каждого значения в Rust есть тип — ярлык, который говорит компилятору, что это за данные: целое число, дробь, текст, истина/ложь и так далее. Зная тип, Rust может проверить код на ошибки до его запуска.
Как ты видел в уроке про переменные, обычно Rust умеет сам вывести тип. Но основные типы полезно знать по именам: ты будешь встречать их в сообщениях об ошибках и в сигнатурах функций.
Целые числа
Заголовок раздела «Целые числа»Целые числа — это числа без дробной части, например 42 или -7. В Rust несколько целочисленных типов: они отличаются размером и тем, можно ли хранить отрицательные числа:
| Тип | Со знаком? | Где обычно используется |
|---|---|---|
i32 |
Да (может быть отрицательным) | Тип по умолчанию — используй его, если нет причин выбрать другой |
u32 |
Нет (от 0 и выше) | Количество, размеры — всё, что не бывает отрицательным |
i64 / u64 |
Да / Нет | Очень большие числа |
usize |
Нет | Индексы в коллекциях |
fn main() { let temperature = -5; // по умолчанию i32 let count: u32 = 100; // явно без знака println!("{temperature} градусов, количество: {count}");}Вывод:
-5 градусов, количество: 100Числа с плавающей точкой (дроби)
Заголовок раздела «Числа с плавающей точкой (дроби)»Для чисел с дробной частью используются типы с плавающей точкой. Их два: f64 (по умолчанию, двойная точность) и f32.
fn main() { let pi = 3.14159; // по умолчанию f64 let price: f32 = 9.99; println!("Пи равно {pi}, цена — {price}");}Вывод:
Пи равно 3.14159, цена — 9.99Оставайся на f64, если тебе не нужен именно меньший f32: f64 точнее и на современном железе работает так же быстро. Обрати внимание: дробная часть в Rust всегда отделяется точкой, а не запятой.
Логические значения
Заголовок раздела «Логические значения»Логический тип (bool) — самый простой: его значение либо true, либо false. Ты будешь постоянно использовать его в if и условиях.
fn main() { let is_logged_in = true; let has_permission: bool = false; println!("вход выполнен: {is_logged_in}, доступ: {has_permission}");}Вывод:
вход выполнен: true, доступ: falseСимволы
Заголовок раздела «Символы»char хранит один символ и записывается в одинарных кавычках ' '. char в Rust может быть любым одиночным скалярным значением Unicode — это включает большинство эмодзи и, конечно, буквы кириллицы. Но некоторые сложные эмодзи (например, флаги или эмодзи, собранные из нескольких соединённых символов) в один char не помещаются.
fn main() { let letter = 'Я'; let symbol = '$'; let crab = '🦀'; println!("{letter} {symbol} {crab}");}Вывод:
Я $ 🦀Строки (текст)
Заголовок раздела «Строки (текст)»Текст в Rust пишется в двойных кавычках. Тебе встретятся два строковых типа:
&str— строковый срез, обычно текст, который ты пишешь прямо в коде («строковый литерал»).String— расширяемый текст, которым ты владеешь: его можно изменять и дополнять.
fn main() { let greeting = "Привет"; // &str let mut name = String::from("Феррис"); // String name.push_str("-краб"); // String может расти println!("{greeting}, {name}!");}Вывод:
Привет, Феррис-краб!Пока не переживай о разнице между &str и String — она связана с владением, которое ты скоро изучишь. Сейчас достаточно так: для текста пиши "...", а String бери, когда текст нужно собирать или менять.
Аннотации типов
Заголовок раздела «Аннотации типов»Чаще всего Rust выводит тип сам. Но иногда ему нужна подсказка — например, при разборе текста в число (это будет в уроке Приведение типов). Тип указывается после двоеточия:
let x: i32 = 42;let y: f64 = 3.5;let active: bool = true;Краткая справка
Заголовок раздела «Краткая справка»| Тип | Что хранит | Пример |
|---|---|---|
i32 |
Целое число (по умолчанию) | let n = 42; |
u32 |
Неотрицательное целое число | let n: u32 = 42; |
f64 |
Дробное число (по умолчанию) | let pi = 3.14; |
bool |
true или false |
let ok = true; |
char |
Один символ | let c = 'A'; |
&str |
Текстовый литерал | let s = "hi"; |
String |
Расширяемый текст | let s = String::from("hi"); |
Практика
Заголовок раздела «Практика»1. Профиль игрока
Заголовок раздела «1. Профиль игрока»Опиши игрового персонажа, взяв по одной переменной каждого типа: имя (&str), уровень (i32), здоровье в процентах (f64), флаг is_online (bool) и букву ранга (char). Выведи всё в одну строку. Подсказка: char пишется в одинарных кавычках, текст — в двойных.
Показать решение
fn main() { let name = "Феррис"; // &str let level = 7; // i32 let health = 82.5; // f64 let is_online = true; // bool let rank = 'A'; // char
println!("{name} | уровень {level} | {health}% | в сети: {is_online} | ранг {rank}");}Вывод:
Феррис | уровень 7 | 82.5% | в сети: true | ранг A2. Собери предложение
Заголовок раздела «2. Собери предложение»Начни с String::from("Rust"), затем добавь к нему " быстрый" и " и безопасный" и выведи результат. Подсказка: String нужно объявить с mut, иначе push_str не сможет её изменить.
Показать решение
fn main() { let mut sentence = String::from("Rust"); sentence.push_str(" быстрый"); sentence.push_str(" и безопасный"); println!("{sentence}");}Вывод:
Rust быстрый и безопасный- У каждого значения есть тип; обычно Rust выводит его сам.
- Целые числа →
i32(по умолчанию). Дробные →f64(по умолчанию). bool— этоtrue/false;char— один символ в одинарных кавычках.- Текст пишется в двойных кавычках:
&strдля литералов,Stringдля расширяемого текста.
Проверь себя
Заголовок раздела «Проверь себя»Проверь себя
1. Какой целочисленный тип Rust использует по умолчанию, если ты его не указал?
2. Как Rust отличает символьный литерал от строкового?
3. Какой тип — это расширяемый текст, которым ты владеешь и который можно изменять?
4. Какой тип с плавающей точкой в Rust используется по умолчанию?
5. Какой тип выведет Rust для let greeting = "Hello";?
Результат: 0 / 5
Что почитать
Заголовок раздела «Что почитать»- Типы данных — книга «Язык программирования Rust»: все скалярные типы с размерами и диапазонами, а также переполнение целых чисел и составные типы (кортежи и массивы) (перевод на русский).
- Примитивы — Rust на примерах: примеры каждого базового типа, которые можно запустить, и продолжение про литералы вроде
1_000и0x80(перевод на русский). i32— документация стандартной библиотеки (на английском): наименьшее и наибольшее значения (i32::MIN,i32::MAX) и множество методов, которые есть у чисел.char— документация стандартной библиотеки (на английском): что такое скалярное значение Unicode и почемуcharвсегда занимает 4 байта.String— документация стандартной библиотеки (на английском): какStringсвязан с&str, и все методы для сборки и изменения текста.