Перейти к содержимому

Типы данных в 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");

Опиши игрового персонажа, взяв по одной переменной каждого типа: имя (&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 | ранг A
▶ Попробуй сам

Начни с 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