欢迎来到 AI 中文社区(简称 AI 中文社),这里是学习交流 AI 人工智能技术的中文社区。 为了更好的体验,本站推荐使用 Chrome 浏览器。
全部教程·
Rust语言·
Rust高级编程
[目录]
·
DeRef
Rust 高级编程
Rust 非安全程序设计
Rust 安全代码
安全与非安全代码对比 安全与非安全代码交互 非安全Rust能做什么 编写非安全代码数据布局
repr(Rust) 类型中的奇行种 可选的数据表达方式所有权
所有权 引用 别名 生命周期 生命周期的局限 省略生命周期 无界生命周期 高阶trait边界 子类型和变性 Drop检查 幽灵数据 分解借用类型转换
类型转换 强制类型转换 点操作符 显式类型转换 变形未初始化内存
未初始化内存 安全方式 Drop标志 非安全方式资源管理
基于所有权的资源管理 构造函数 析构函数 泄露展开
展开 异常安全性 污染并发
并发 竞争 Send和Sync 原子操作实现 Vec
实现 Vec 布局 内存分配 push和pop 回收资源 DeRef 插入和删除 IntoIter RawVec Drain 处理零尺寸类型 最终代码FFI
FFI
Rust 高级编程
Rust 非安全程序设计
Rust 安全代码
安全与非安全代码对比 安全与非安全代码交互 非安全Rust能做什么 编写非安全代码数据布局
repr(Rust) 类型中的奇行种 可选的数据表达方式所有权
所有权 引用 别名 生命周期 生命周期的局限 省略生命周期 无界生命周期 高阶trait边界 子类型和变性 Drop检查 幽灵数据 分解借用类型转换
类型转换 强制类型转换 点操作符 显式类型转换 变形未初始化内存
未初始化内存 安全方式 Drop标志 非安全方式资源管理
基于所有权的资源管理 构造函数 析构函数 泄露展开
展开 异常安全性 污染并发
并发 竞争 Send和Sync 原子操作实现 Vec
实现 Vec 布局 内存分配 push和pop 回收资源 DeRef 插入和删除 IntoIter RawVec Drain 处理零尺寸类型 最终代码FFI
FFIRust DeRef
我们已经实现了一个成熟的栈。我们可以push、可以pop、也可以自动清理。但是还是有一堆的功能是我们需要的。特别是,我们已经有了一个很好的数组,但是还没有slice相关的功能。这非常容易解决:我们可以实现Deref<Target=[T]>。这样我们的Vec就神奇地变成了slice。
我们只需要使用slice::from_raw_parts。它能够为我们正确处理空slice。等到后面我们完成了零尺寸类型的支持,它们依然可以完美配合。
use std::ops::Deref;
impl<T> Deref for Vec<T> {
type Target = [T];
fn deref(&self) -> &[T] {
unsafe {
::std::slice::from_raw_parts(self.ptr.as_ptr(), self.len)
}
}
}
我们把DefMut也实现了吧:
use std::ops::DerefMut;
impl<T> DerefMut for Vec<T> {
fn deref_mut(&mut self) -> &mut [T] {
unsafe {
::std::slice::from_raw_parts_mut(self.ptr.as_ptr(), self.len)
}
}
}
现在我们有了len、first、last、索引、分片、排序、iter、iter_mut,以及其他所有的slice提供的功能。
下一章:Rust 插入和删除
slice并没有提供插入和删除功能,接下来我们就实现它们。插入需要把目标位置后的所有元素都向右移动1。这里我们需要用到ptr::copy,它就是C中的memmove的Rust版。它把一块内存从一个地方拷贝到另一个地方, ...
AI 中文社