Объединения
Объединения похожи на перечисления, но активное поле нужно отслеживать самостоятельно:
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
#[repr(C)]
union MyUnion {
i: u8,
b: bool,
}
fn main() {
let u = MyUnion { i: 42 };
println!("int: {}", unsafe { u.i });
println!("bool: {}", unsafe { u.b }); // Неопределённое поведение!
}
This slide should take about 5 minutes.
В Rust объединения нужны редко, потому что перечисления представляют собой лучшую альтернативу. Иногда они нужны для взаимодействия с API библиотек C.
Если нужно просто переинтерпретировать байты как другой тип, вероятно, вам нужен std::mem::transmute или безопасная обёртка, например крейт zerocopy.