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

Уроки · 30

Тип f32

f32 уже несколько раз мелькало в коде без объяснения — в уроке «Константы» (const SPEED: f32 = 8.0;), в уроке «Свои функции» (-> (f32, f32)). Пора разобраться, что это вообще такое.

У любого значения в программе есть тип — ярлык, который говорит, что это за значение и что с ним вообще можно делать. 10.0 и "привет" — явно разные вещи: одно можно складывать и умножать, другое — нет. Тип как раз и есть тот ярлык, который это различает.

f32 — это тип для чисел вроде 10.0, 0.5, -3.7 — с точкой и дробной частью. Именно такие числа нужны почти везде в игре: позиция на экране, расстояние, доля от 0 до 1 — всё это редко бывает ровно целым числом.

Такие числа называют “числами с плавающей точкой” — сама точка внутри числа как бы не закреплена на одном месте, а “плавает”: в 3.14 она стоит после первой цифры, в 0.001 — после трёх нулей. 32 в названии — это про то, сколько места такое число занимает в памяти компьютера; здесь достаточно знать, что это число само по себе особо не влияет на то, как мы пишем код.

Мы никогда раньше не писали слово f32 сами — и тем не менее все наши числа были именно этого типа. Дело в том, что все функции macroquad — screen_width(), draw_circle, mouse_position() — устроены так, что ждут и возвращают именно f32. Когда мы пишем let x = 10.0;, а потом передаём x в draw_circle, Rust смотрит, как x используется дальше, и сам выбирает подходящий тип — здесь это f32, потому что именно его ждёт draw_circle. Мы не называем тип вслух, но он там есть с самого начала.

А вот с const так не получается. Обычная переменная живёт в одном конкретном месте кода, и Rust видит, как именно она используется дальше — оттуда и берётся тип. Константу же можно использовать где угодно в файле, в самых разных местах сразу, и единого “места использования”, по которому угадать тип, просто нет. Поэтому у const тип — обязательная часть объявления, а не подсказка: const SPEED: f32 = 8.0; без : f32 не скомпилируется.

  • Тип — это ярлык у значения: что оно такое и что с ним можно делать.
  • f32 — число с дробной частью, ровно то, что нужно для позиций, расстояний и долей на экране.
  • Мы не писали f32 явно почти нигде — Rust сам подставлял этот тип, глядя, что наши числа передаются в функции macroquad, которые его ждут.
  • У const такого “места использования” нет, поэтому тип приходится писать явно, а не полагаться на то, что Rust его угадает.