Преобразование типов
В Rust нет неявных преобразований типов, но есть явные приведения через as. Обычно они следуют семантике C там, где та определена.
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
fn main() {
let value: i64 = 1000;
println!("as u16: {}", value as u16);
println!("as i16: {}", value as i16);
println!("as u8: {}", value as u8);
}
Результаты as в Rust всегда определены и одинаковы на всех платформах. Это может не совпадать с вашей интуицией при смене знака или приведении к меньшему типу — сверьтесь с документацией и добавьте комментарий для ясности.
Приведение через as — довольно острый инструмент, которым легко ошибиться, и он может стать источником тонких ошибок, когда при дальнейшей разработке меняются используемые типы или диапазоны значений. Приведения лучше использовать только тогда, когда намерение — безусловно отбросить старшие биты (например, выбрать младшие 32 бита u64 через as u32, независимо от того, что было в старших битах).
Для приведений, которые не могут завершиться ошибкой (например, u32 в u64), предпочтительнее использовать From или Into, а не as, чтобы подтвердить, что приведение действительно безошибочно. Для приведений, которые могут не сработать, доступны TryFrom и TryInto, если нужно по-разному обрабатывать значения, которые помещаются, и те, которые не помещаются.
Подумайте о перерыве после этого слайда.
as похож на статическое приведение (static cast) в C++. Использование as там, где данные могут потеряться, обычно не одобряется, или, по крайней мере, требует поясняющего комментария.
Это распространено при приведении целых к usize для использования в качестве индекса.