|
|
@ -29,16 +29,16 @@ Rust 生命周期之所以难,是因为这个概念对于我们来说是全新
|
|
|
|
|
|
|
|
|
|
|
|
此处 `r` 就是一个悬垂指针,它引用了提前被释放的变量 `x`,可以预料到,这段代码会报错:
|
|
|
|
此处 `r` 就是一个悬垂指针,它引用了提前被释放的变量 `x`,可以预料到,这段代码会报错:
|
|
|
|
```console
|
|
|
|
```console
|
|
|
|
error[E0597]: `x` does not live long enough // x活得不够久
|
|
|
|
error[E0597]: `x` does not live long enough // `x` 活得不够久
|
|
|
|
--> src/main.rs:7:17
|
|
|
|
--> src/main.rs:7:17
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 | r = &x;
|
|
|
|
7 | r = &x;
|
|
|
|
| ^^ borrowed value does not live long enough // 被借用的x活得不够久
|
|
|
|
| ^^ borrowed value does not live long enough // 被借用的 `x` 活得不够久
|
|
|
|
8 | }
|
|
|
|
8 | }
|
|
|
|
| - `x` dropped here while still borrowed // x在这里被丢弃,但是它依然还在被借用
|
|
|
|
| - `x` dropped here while still borrowed // `x` 在这里被丢弃,但是它依然还在被借用
|
|
|
|
9 |
|
|
|
|
9 |
|
|
|
|
10 | println!("r: {}", r);
|
|
|
|
10 | println!("r: {}", r);
|
|
|
|
| - borrow later used here // 对x的借用在此处被使用
|
|
|
|
| - borrow later used here // 对 `x` 的借用在此处被使用
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
在这里 `r` 拥有更大的作用域,或者说**活得更久**。如果 Rust 不阻止该垂悬引用的发生,那么当 `x` 被释放后,`r` 所引用的值就不再是合法的,会导致我们程序发生异常行为,且该异常行为有时候会很难被发现。
|
|
|
|
在这里 `r` 拥有更大的作用域,或者说**活得更久**。如果 Rust 不阻止该垂悬引用的发生,那么当 `x` 被释放后,`r` 所引用的值就不再是合法的,会导致我们程序发生异常行为,且该异常行为有时候会很难被发现。
|
|
|
@ -55,7 +55,7 @@ error[E0597]: `x` does not live long enough // x活得不够久
|
|
|
|
} // -+ |
|
|
|
|
} // -+ |
|
|
|
|
// |
|
|
|
|
// |
|
|
|
|
println!("r: {}", r); // |
|
|
|
|
println!("r: {}", r); // |
|
|
|
|
}
|
|
|
|
} // ---------+
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
这段代码和之前的一模一样,唯一的区别在于增加了对变量生命周期的注释。这里,`r` 变量被赋予了生命周期 `'a`,`x` 被赋予了生命周期 `'b`,从图示上可以明显看出生命周期 `'b` 比 `'a` 小很多。
|
|
|
|
这段代码和之前的一模一样,唯一的区别在于增加了对变量生命周期的注释。这里,`r` 变量被赋予了生命周期 `'a`,`x` 被赋予了生命周期 `'b`,从图示上可以明显看出生命周期 `'b` 比 `'a` 小很多。
|
|
|
@ -126,7 +126,7 @@ help: consider introducing a named lifetime parameter // 考虑引入一个生
|
|
|
|
因此,这时就回到了文章开头说的内容:在存在多个引用时,编译器有时会无法自动推导生命周期,此时就需要我们手动去标注,通过为参数标注合适的生命周期来帮助编译器进行借用检查的分析。
|
|
|
|
因此,这时就回到了文章开头说的内容:在存在多个引用时,编译器有时会无法自动推导生命周期,此时就需要我们手动去标注,通过为参数标注合适的生命周期来帮助编译器进行借用检查的分析。
|
|
|
|
|
|
|
|
|
|
|
|
## 生命周期标注语法
|
|
|
|
## 生命周期标注语法
|
|
|
|
> 生命周期标注并不会改变任何引用的实际作用域 - 鲁迅
|
|
|
|
> 生命周期标注并不会改变任何引用的实际作用域 -- 鲁迅
|
|
|
|
|
|
|
|
|
|
|
|
鲁迅说过的话,总是值得重点标注,当你未来更加理解生命周期时,你才会发现这句话的精髓和重要!现在先简单记住,**标记的生命周期只是为了取悦编译器,让编译器不要难为我们**,记住了吗?没记住,再回头看一遍,这对未来你遇到生命周期问题时会有很大的帮助!
|
|
|
|
鲁迅说过的话,总是值得重点标注,当你未来更加理解生命周期时,你才会发现这句话的精髓和重要!现在先简单记住,**标记的生命周期只是为了取悦编译器,让编译器不要难为我们**,记住了吗?没记住,再回头看一遍,这对未来你遇到生命周期问题时会有很大的帮助!
|
|
|
|
|
|
|
|
|
|
|
@ -588,6 +588,6 @@ where
|
|
|
|
## 总结
|
|
|
|
## 总结
|
|
|
|
我不知道支撑我一口气写完的勇气是什么,也许是不做完不爽夫斯基,也许是一些读者对本书的期待,不管如何,这章足足写了 17000 字,可惜不是写小说,不然肯定可以获取很多月票 :)
|
|
|
|
我不知道支撑我一口气写完的勇气是什么,也许是不做完不爽夫斯基,也许是一些读者对本书的期待,不管如何,这章足足写了 17000 字,可惜不是写小说,不然肯定可以获取很多月票 :)
|
|
|
|
|
|
|
|
|
|
|
|
从本章开始,最大的收获就是可以在结构体中使用引用类型了,说实话,为了引入这个特性,我已经憋了足足30章节。。
|
|
|
|
从本章开始,最大的收获就是可以在结构体中使用引用类型了,说实话,为了引入这个特性,我已经憋了足足 30 章节……
|
|
|
|
|
|
|
|
|
|
|
|
但是,还没完,是的,就算是将近2万字,生命周期的旅程依然没有完结,下一节将介绍一些关于生命周期的高级特性,这些特性你在其它中文书中目前还看不到的。
|
|
|
|
但是,还没完,是的,就算是将近两万字,生命周期的旅程依然没有完结,下一节将介绍一些关于生命周期的高级特性,这些特性你在其它中文书中目前还看不到的。
|
|
|
|