本文簡要介紹rust語言中 std::mem::MaybeUninit.assume_init
的用法。
用法
pub unsafe fn assume_init(self) -> T
從 MaybeUninit<T>
容器中提取值。這是確保數據被丟棄的好方法,因為生成的T
會受到通常的丟棄處理。
安全性
由調用者來保證 MaybeUninit<T>
確實處於初始化狀態。當內容尚未完全初始化時調用此方法會立即導致未定義的行為。 type-level 文檔包含有關此初始化不變量的更多信息。
最重要的是,請記住,大多數類型除了被視為在類型級別初始化之外,還具有其他不變量。例如,一個1
-初始化std::vec::Vec被視為已初始化(在當前實現下;這不構成穩定的保證),因為編譯器知道的唯一要求是數據指針必須為非空。創建這樣一個Vec<T>
不會導致即時未定義的行為,但會導致大多數安全操作(包括刪除它)的未定義行為。
例子
此方法的正確用法:
use std::mem::MaybeUninit;
let mut x = MaybeUninit::<bool>::uninit();
x.write(true);
let x_init = unsafe { x.assume_init() };
assert_eq!(x_init, true);
此方法的錯誤使用:
use std::mem::MaybeUninit;
let x = MaybeUninit::<Vec<u32>>::uninit();
let x_init = unsafe { x.assume_init() };
// `x` had not been initialized yet, so this last line caused undefined behavior. ⚠️
相關用法
- Rust MaybeUninit.assume_init_mut用法及代碼示例
- Rust MaybeUninit.assume_init_ref用法及代碼示例
- Rust MaybeUninit.assume_init_read用法及代碼示例
- Rust MaybeUninit.as_ptr用法及代碼示例
- Rust MaybeUninit.as_mut_ptr用法及代碼示例
- Rust MaybeUninit.array_assume_init用法及代碼示例
- Rust MaybeUninit.write_slice用法及代碼示例
- Rust MaybeUninit.zeroed用法及代碼示例
- Rust MaybeUninit.write_slice_cloned用法及代碼示例
- Rust MaybeUninit.write用法及代碼示例
- Rust MaybeUninit.uninit用法及代碼示例
- Rust MaybeUninit.new用法及代碼示例
- Rust MaybeUninit.uninit_array用法及代碼示例
- Rust MaybeUninit用法及代碼示例
- Rust ManuallyDrop用法及代碼示例
- Rust ManuallyDrop.into_inner用法及代碼示例
- Rust ManuallyDrop.new用法及代碼示例
- Rust Map用法及代碼示例
- Rust Mutex.new用法及代碼示例
- Rust MetadataExt.st_ctime_nsec用法及代碼示例
- Rust MetadataExt.mtime_nsec用法及代碼示例
- Rust MetadataExt.nlink用法及代碼示例
- Rust MulAssign.mul_assign用法及代碼示例
- Rust Mutex.get_mut用法及代碼示例
- Rust MetadataExt.st_atime用法及代碼示例
注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 std::mem::MaybeUninit.assume_init。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。