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

Уроки · 6

Переменные

Прежде чем двигаться дальше, остановимся на секунду и разберём один приём, который уже пригодился в уроке “Ввод с клавиатуры”, но остался без объяснения.

В уроке “Ввод с клавиатуры” код выглядел так:

// Стрелка вверх зажата — рисуем круг.
if is_key_down(KeyCode::Up) {
draw_circle(screen_width() / 2.0, screen_height() / 2.0, 100.0, YELLOW);
}

screen_width() и screen_height() возвращают ширину и высоту игрового окна в пикселях. Запись получается длинной: два похожих выражения подряд внутри одного вызова draw_circle, и с первого взгляда не всегда понятно, где тут что.

Можно дать каждому вычисленному значению своё имя — и вызов draw_circle станет короче и понятнее:

// Ширина экрана, поделённая пополам — центр по горизонтали.
let center_x = screen_width() / 2.0;

Разберём по кусочкам. let — ключевое слово: слово, уже занятое Rust под особый смысл — “дальше будет новая переменная”. Оно всегда одно и то же и придумано не нами, поэтому его нельзя взять как имя для своей переменной — Rust решит, что это снова та самая команда, а не имя. После него через пробел — имя, какое захочешь, здесь это center_x. А = — не “равно” из математики, а оператор присваивания: “посчитай то, что справа, и положи результат в то, что слева”.

Переменную проще всего представить как контейнер для значения — ячейку, корзинку, коробку, называй как удобнее. Присваивание кладёт значение внутрь, а имя — это подпись на контейнере: по ней его и отличают от остальных. Дальше по коду достаточно написать имя — center_x — и оттуда возьмётся то же самое значение, не переписывая выражение целиком заново.

Замени содержимое src/main.rs на это:

src/main.rs
use macroquad::prelude::*;
#[macroquad::main("Ввод с клавиатуры")]
async fn main() {
loop {
clear_background(BLACK);
// Стрелка вверх зажата — рисуем круг по центру экрана.
if is_key_down(KeyCode::Up) {
let center_x = screen_width() / 2.0;
let center_y = screen_height() / 2.0;
draw_circle(center_x, center_y, 100.0, YELLOW);
}
next_frame().await;
}
}

На экране ничего не изменилось — тот же кружок по той же клавише:

  • center_x и center_y объявлены прямо внутри if, рядом с местом, где используются — draw_circle(center_x, center_y, ...) читается проще, чем draw_circle(screen_width() / 2.0, screen_height() / 2.0, ...).
  • center_x и center_y — обычные переменные, без mut: значение, которое они получили, дальше не меняется.

Называть так значение стоит, когда это реально помогает — выражение длинное или повторяется несколько раз. Это не обязательное правило: если выражение короткое и используется один раз, как screen_width() / 2.0 сам по себе, отдельная переменная ради него не нужна.