Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Преобразование типов

В 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, если нужно по-разному обрабатывать значения, которые помещаются, и те, которые не помещаются.

This slide should take about 5 minutes.

Подумайте о перерыве после этого слайда.

as похож на статическое приведение (static cast) в C++. Использование as там, где данные могут потеряться, обычно не одобряется, или, по крайней мере, требует поясняющего комментария.

Это распространено при приведении целых к usize для использования в качестве индекса.