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

Уроки · 33

Целые числа

В уроке «Цикл for» уже промелькнули usize и as f32 — без объяснения, просто чтобы код заработал. Разберёмся, что это такое.

В уроке «Тип f32» мы разобрались с числами вроде 10.0 и 0.5 — у них есть дробная часть, даже если она нулевая. Но не всем числам в программе дробная часть вообще нужна. Иногда нужно просто сосчитать что-то по одному, как по пальцам: сколько раз повторить цикл, какой по счёту элемент сейчас обрабатывается. Элемент может быть третьим или четвёртым, но не “третьим с половиной” — порядковый номер всегда получается целым. Для чисел с таким смыслом в Rust есть отдельная семья типов — целые числа, без точки и без дробной части.

Самый частый тип из этой семьи — usize. Это целое число, которое Rust использует везде, где речь идёт о количестве или порядковом номере чего-либо: сколько раз повторить цикл, какой по счёту элемент взять. В уроке «Цикл for» именно поэтому у COUNT тип usize — это не длина чего-либо и не позиция на экране, а просто количество кружков:

const COUNT: usize = 5;

А диапазон 0..COUNT в for i in 0..COUNT — это диапазон usize чисел, и i на каждом шаге цикла тоже оказывается usize.

В уроке «Тип f32» Rust сам подставлял f32 там, где он видел, что число используется как f32 дальше по коду. Но это работает, только пока у числа ещё нет типа. А если он уже есть — как у i, который usize, — Rust его менять не станет: типы не угадываются по второму разу.

Из-за этого i нельзя напрямую умножить на STEP, у которого тип f32, — Rust отказывается молча смешивать разные типы чисел, даже такие близкие, как usize и f32. Нужно явно сказать: “возьми это число и сделай его на время f32”. Для этого и существует as:

// i — usize, STEP — f32. as f32 переводит i в f32 перед умножением.
let x = START_X + STEP * (i as f32);

i as f32 не трогает сам i — он как был usize, так и остался. as f32 создаёт новое число того же значения, но уже типа f32, и именно оно участвует в умножении.

  • Целые числа — числа без дробной части, для всего, что считается поштучно: сколько раз, какой по счёту.
  • usize — самый частый целый тип, тип количества и порядкового номера. Поэтому у COUNT в уроке «Цикл for» и у i внутри for i in 0..COUNT именно этот тип.
  • Rust сам подставляет тип, только пока у числа его ещё нет. Когда тип уже есть, как у i, Rust его не меняет — даже если рядом нужен другой тип.
  • as — явный перевод числа в другой тип. i as f32 берёт usize и даёт на выходе f32 того же значения, не меняя сам i.