本文简要介绍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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。