欢迎来到 AI 中文社区(简称 AI 中文社),这里是学习交流 AI 人工智能技术的中文社区。 为了更好的体验,本站推荐使用 Chrome 浏览器。
全部教程·
Rust语言·
Rust高级编程
[目录]
·
省略生命周期
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 省略生命周期
为了让语言的表达方式更人性化,Rust允许函数的签名中省略生命周期。
“生命周期位置”指的是你在类型中可以写生命周期的地方。
&'a T &'a mut T T<'a>
生命周期的位置可以在“输入”也可以在“输出”:
- 对于
fn定义的函数,“输入”指的是函数签名中的参数的类型,而“输出”是结果的类型。所以fn foo(s: &str) -> (&str, &str)省略了一个在输入位置处的生命周期和两个结果位置的生命周期。注意,fn方法定义中的输入位置不包括impl头处的生命周期(自然地,对于trait的默认方法,也不包括trait的头的位置)。 - 在未来,应该也可能会省略
impl头位置处的生命周期。
省略的规则如下:
- 每一个在输入位置省略的生命周期都对应一个唯一的生命周期参数。
- 如果只有一个输入的生命周期位置(无论省略还是没省略),那个生命周期会赋给所有省略了的输出生命周期。
- 如果有多个输入生命周期位置,而其中一个是
&self或者&mut self,那么self的生命周期会赋给所有省略了的输出生命周期。 - 除了上述两种情况,其他省略生命周期的情况都是错误的。
几个例子:
fn print(s: &str); // 省略的 fn print<'a>(s: &'a str); // 完整的 fn debug(lvl: usize, s: &str); // 省略的 fn debug<'a>(lvl: usize, s: &'a str); // 完整的 fn substr(s: &str, until: usize) -> &str; // 省略的 fn substr<'a>(s: &'a str, until: usize) -> &'a str; // 完整的 fn get_str() -> &str; // 错误 fn frob(s: &str, t: &str) -> &str; // 错误 fn get_mut(&mut self) -> &mut T; // 省略的 fn get_mut<'a>(&'a mut self) -> &'a mut T; // 完整的 fn args<T: ToCStr>(&mut self, args: &[T]) -> &mut Command // 省略的 fn args<'a, 'b, T: ToCStr>(&'a mut self, args: &'b [T]) -> &'a mut Command // 完整的 fn new(buf: &mut [u8]) -> BufWriter; // 省略的 fn new<'a>(buf: &'a mut [u8]) -> BufWriter<'a> // 完整的
下一章:Rust 无界生命周期
非安全代码经常会凭空变出来一些引用和生命周期。这些生命周期都是无界的。最常见的场景是解引用一个裸指针,然后产生一个拥有无界生命周期的引用。这些生命周期根据上下文的要求,想要多大就可以有多大。这其实比简单的设为'sta ...
AI 中文社