Rust में वेरिएबल और डेटा प्रकार
Что это и зачем?
Представь, что ты играешь в компьютерную игру. У тебя есть инвентарь: меч, зелье здоровья, карта сокровищ. Каждый предмет — это переменная. Ты можешь взять меч (положить его в ячейку), выпить зелье (изменить значение) или выбросить карту (удалить).
В программировании переменные — это те же ячейки, только для данных. Например, чтобы запомнить имя пользователя, количество жизней или температуру за окном. Без переменных компьютер не сможет ничего запомнить, а значит — не сможет выполнять полезные задачи.
Типы данных — это как коробки разной формы. В круглую коробку не положишь квадратный предмет, а в коробку для чисел — текст. Rust строго следит за этим, чтобы не было путаницы. Это как учитель, который проверяет, что ты не пытаешься написать "пять" в клеточке для цифры 5.
Зачем это нужно? Представь, что ты пишешь программу для калькулятора. Если ты скажешь компьютеру: "Сложи 2 и 3", он должен знать, что это числа, а не буквы. Иначе он подумает, что ты хочешь склеить "2" и "3" в "23". Типы данных помогают избежать таких ошибок.
Синтаксис и примеры кода
В Rust переменные объявляются с помощью ключевого слова let. По умолчанию они неизменяемые (как если бы ты написал ручкой — стереть нельзя). Чтобы сделать изменяемой, добавь mut (от mutable — изменяемый).
Вот как это выглядит:
// Объявляем неизменяемую переменную
let имя = "Алиса";
// имя = "Боб"; // Ошибка! Нельзя изменить
// Объявляем изменяемую переменную
let mut возраст = 10;
возраст = 11; // Теперь можно
println!("Привет, {}! Тебе {} лет.", имя, возраст);
Пример 1: Числа (целые и дробные)
// Целые числа (i32 — самый распространённый тип)
let монетки: i32 = 100; // Можно указать тип явно
let жизней = 3; // Или Rust сам догадается
// Дробные числа (f64 — для точности)
let температура = 36.6; // f64 по умолчанию
let пи: f64 = 3.14159;
println!("У тебя {} монеток и {} жизней.", монетки, жизней);
println!("Температура: {}°C, число Пи: {}", температура, пи);
Пример 2: Текст (строки)
// Строка — это текст в кавычках
let имя_пользователя = "Вася"; // &str — строковый срез
let mut сообщение = String::from("Привет, "); // String — изменяемая строка
сообщение.push_str(имя_пользователя); // Добавляем текст
сообщение.push('!'); // Добавляем символ
println!("{}", сообщение); // Выведет: "Привет, Вася!"
Пример 3: Логический тип (да/нет)
// bool — только true (истина) или false (ложь)
let солнце_светит = true;
let дождь_идет = false;
if солнце_светит {
println!("Идём гулять!");
} else if дождь_идет {
println!("Берём зонт.");
} else {
println!("Смотрим в окно.");
}
Пример 4: Кортеж (набор разных типов)
// Кортеж — как рюкзак, где можно положить разные вещи
let игрок = ("Алиса", 10, true); // имя, уровень, онлайн ли
let (имя, уровень, онлайн) = игрок; // Распаковываем
println!("Игрок {} имеет уровень {}", имя, уровень);
if онлайн {
println!("Он сейчас в игре!");
}
Пример 5: Массив (список одинаковых вещей)
// Массив — как пенал с ручками одного цвета
let инвентарь = [1, 2, 3, 4, 5]; // Пять целых чисел
let первый_предмет = инвентарь[0]; // Нумерация с 0!
println!("Первый предмет: {}", первый_предмет);
// Массив строк
let дни_недели = ["Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"];
println!("Сегодня {}", дни_недели[2]); // "Ср"
Сравнение с Python
Python — это как велосипед: легко начать, но можно упасть. Rust — как машина с ремнями безопасности: сложнее, но надёжнее. Вот главные отличия:
| Идея | Python | Rust |
|---|---|---|
| Объявление переменной | name = "Алиса" |
let name = "Алиса"; |
| Изменение переменной | Можно всегда | Только если let mut |
| Тип числа | Не указываем | Нужно указать или Rust сам догадается |
| Строка | "текст" |
"текст" (но есть нюансы) |
| Логический тип | True/False |
true/false |
| Список | [1, 2, 3] |
[1, 2, 3] (но массив, не список) |
В Python ты можешь написать:
x = 5
x = "теперь текст" # Python разрешит
В Rust так нельзя:
let mut x = 5;
x = "теперь текст"; // Ошибка! Тип не совпадает
Rust защищает тебя от глупых ошибок. Если ты случайно перепутаешь число и текст, компилятор скажет: "Эй, так нельзя!". Python же позволит, но потом программа может упасть в самый неподходящий момент.
Типичные ошибки новичков
Ошибка 1: Забыть точку с запятой
let x = 5 // Ошибка! Нужна ;
let y = 10; // Правильно
Ошибка 2: Пытаться изменить неизменяемую переменную
let имя = "Алиса";
имя = "Боб"; // Ошибка! Нельзя изменить
Решение: используй let mut.
Ошибка 3: Путать типы
let число = 5;
let текст = "5";
let сумма = число + текст; // Ошибка! Нельзя сложить число и текст
Решение: преобразуй типы:
let сумма = число + текст.parse::<i32>().unwrap(); // Превращаем текст в число
Ошибка 4: Выход за границы массива
let массив = [1, 2, 3];
println!("{}", массив[5]); // Ошибка! Индекс 5 не существует
Решение: проверяй длину массива (массив.len()) и используй индексы от 0 до длины минус 1.
Ошибка 5: Забыть про неизменяемость строк
let текст = "Привет";
текст.push_str(", мир!"); // Ошибка! &str нельзя изменить
Решение: используй String::from():
let mut текст = String::from("Привет");
текст.push_str(", мир!"); // Теперь работает
Итог
Переменные и типы данных — это основа любой программы. В Rust они работают как строгий учитель: не дают ошибиться, но требуют внимательности. Запомни главное:
- let — объявляет переменную. По умолчанию неизменяемая.
- let mut — если нужно менять значение.
- Типы: числа (i32, f64), строки (&str, String), логические (bool), кортежи, массивы.
- Rust проверяет типы на этапе компиляции — это как проверка билета перед входом в поезд.
- Ошибки — это нормально. Компилятор подскажет, что не так.
Попробуй написать свою первую программу: объяви переменную с именем, возраст и любимый цвет. Выведи их на экран. Потом измени возраст и выведи снова. Ты увидишь, как Rust заботится о том, чтобы всё было правильно.
Помни: каждый великий программист начинал с переменных. Теперь ты знаешь то же, что и они. Удачи!