категории | RSS

Как для скриптокодера для меня многое в диковинку в практике программирования на ЯП со статической типизацией. Так меня осенило как-то, что переменные, которые используются в основном для индексации векторов и массивов имеет смысл иметь тип "usize". До этого я ничтоже сумняшеся инициализировал их дефолтным числовым типом "i32". Ну а что, удобно же (в Rust если у числа не указан тип, оно по умолчанию относится к типу "i32").
‎Юмор в том, что "i32" это знаковый тип с диапазоном значений от -128 до 127, а индексы в Rust должны быть исключительно положительными. Когда я осознал эту нелепость, я сначала перевел переменные-индексы на использование типа "u32", беззнаковых 32-х битных целых. Но здесь вступает другой нюанс. Rust для операции индексации использует значения типа "usize". Этот тип платформозависим: на 32-х битных ОС он является аналогом типа "u32", на 64-х битных — аналогом типа "u64". Это логично, давать возможность использовать максимально большое число для индексации. Rust в операции индексации не приводит автоматически индексы к типу "usize", поэтому нужно это делать вручную, что выглядит как:


let v = vec![1, 2, 5];
println!("{}", v[1 as usize]);


Примечание: если в качестве индекса используется числовой литерал без указания типа, то Rust скомпилирует код, но для его корректности тип литерала выведется как "usize", хотя, как я уже отметил выше, по дефолту числовые литералы без указания типа относятся к типу "i32":


fn main() {
let index = 1; // при компиляции эта строка будет, условно говоря заменена на "let index: usize = 1" или "let index = 1usize"
let item = vec![1, 2, 3][index];
println!("{:?}", item);
}


В результате мой код пестрел "as usize"-ами. Заменил "u32" на "usize", стало хорошо. Ну и да, подозреваю, что используй я "Clippy", инструмент проверяющий Rust код на наличие "вредных привычек" и глупостей, он вероятно обратил бы мое внимание на этот факт.

Virtuos86
2017-10-12T13:58:02Z

Здесь находятся
всего 0. За сутки здесь было 0 человек
Яндекс.Метрика