Функция uninit
Функция uninit класса MaybeUninit создаёт значение типа MaybeUninit<T>, которое не содержит инициализированных данных. Она не принимает параметров и возвращает объект, память которого не заполнена никаким конкретным значением. Данная функция является ассоциированной функцией и вызывается как MaybeUninit::uninit. Использование этой функции позволяет отложить инициализацию значения до более подходящего момента, что полезно при работе с низкоуровневой памятью.
Синтаксис
MaybeUninit::<T>::uninit()
Пример
Давайте создадим неинициализированное значение типа i32 и запишем в него число 123, а затем безопасно извлечём его с помощью метода assume_init:
use std::mem::MaybeUninit;
fn main()
{
let mut value: MaybeUninit<i32> = MaybeUninit::uninit();
value.write(123);
let res = unsafe { value.assume_init() };
println!("{}", res);
}
Результат выполнения кода:
123
Пример
Давайте создадим неинициализированный массив из пяти элементов типа i32, заполним его значениями и выведем на экран:
use std::mem::MaybeUninit;
fn main()
{
let mut arr: [MaybeUninit<i32>; 5] = unsafe {
MaybeUninit::uninit().assume_init()
};
for (i, elem) in arr.iter_mut().enumerate() {
elem.write(i as i32 * 10);
}
let res: [i32; 5] = unsafe {
std::mem::transmute(arr)
};
println!("{:?}", res);
}
Результат выполнения кода:
[0, 10, 20, 30, 40]
Пример
Давайте создадим неинициализированную переменную типа f64, запишем в неё число 3.14 и выведем результат:
use std::mem::MaybeUninit;
fn main()
{
let mut value: MaybeUninit<f64> = MaybeUninit::uninit();
value.write(3.14);
let res = unsafe { value.assume_init() };
println!("{}", res);
}
Результат выполнения кода:
3.14
Смотрите также
-
метод
assume_init,
который извлекает значение из MaybeUninit -
метод
write,
который записывает значение в MaybeUninit -
метод
zeroed,
который создаёт значение, заполненное нулями -
метод
new,
который создаёт MaybeUninit с начальным значением