Уроки · 33
Целые числа
В уроке «Цикл for» уже промелькнули usize и as f32
— без объяснения, просто чтобы код заработал. Разберёмся, что это
такое.
Числа без дробной части
Заголовок раздела «Числа без дробной части»В уроке «Тип f32» мы разобрались с числами вроде 10.0 и
0.5 — у них есть дробная часть, даже если она нулевая. Но не всем
числам в программе дробная часть вообще нужна. Иногда нужно просто
сосчитать что-то по одному, как по пальцам: сколько раз повторить
цикл, какой по счёту элемент сейчас обрабатывается. Элемент может быть
третьим или четвёртым, но не “третьим с половиной” — порядковый номер
всегда получается целым. Для чисел с таким смыслом в Rust есть
отдельная семья типов — целые числа, без точки и без дробной
части.
usize — число для счёта
Заголовок раздела «usize — число для счёта»Самый частый тип из этой семьи — usize. Это целое число, которое
Rust использует везде, где речь идёт о количестве или порядковом
номере чего-либо: сколько раз повторить цикл, какой по счёту элемент
взять. В уроке «Цикл for» именно поэтому у COUNT
тип usize — это
не длина чего-либо и не позиция на экране, а просто количество
кружков:
const COUNT: usize = 5;А диапазон 0..COUNT в for i in 0..COUNT — это диапазон usize
чисел, и i на каждом шаге цикла тоже оказывается usize.
as — явный перевод из одного типа в другой
Заголовок раздела «as — явный перевод из одного типа в другой»В уроке «Тип 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.