pull/176/head
sunface 3 years ago
commit cf9fd5a56e

@ -10,6 +10,7 @@
下表中,`expr`是表达式,`ident`是标识符,`type`是类型,`var`是变量,`trait`是特征,`pat`是匹配分支(pattern)。
<span class="caption">表 B-1: 运算符</span>
| 运算符 | 示例 | 解释 | 是否可重载 |
|----------|---------|-------------|---------------|
| `!` | `ident!(...)`, `ident!{...}`, `ident![...]` | 宏展开 | |

@ -141,7 +141,7 @@ error[E0499]: cannot borrow `s` as mutable more than once at a time 同一时间
| -- first borrow later used here 第一个借用在这里使用
```
这段代码出错的原因在于,第一个可变借用`r1`必须要持续到最后一次使用的位置`println!`,在`r1`创建和最后一次使用之间,我们又尝试创建第二个引用`r2`。
这段代码出错的原因在于,第一个可变借用`r1`必须要持续到最后一次使用的位置`println!`,在`r1`创建和最后一次使用之间,我们又尝试创建第二个可变引用`r2`。
对于新手来说,这个特性绝对是一大拦路虎,也是新人们谈之色变的编译器`borrow checker`特性之一不过各行各业都一样限制往往是出于安全的考虑Rust也一样。
@ -150,7 +150,7 @@ error[E0499]: cannot borrow `s` as mutable more than once at a time 同一时间
- 至少有一个指针被用来写入数据
- 没有同步数据访问的机制
数据竞争会导致未定义行为难以在运行时追踪并且难以诊断和修复。而Rust避免了这种情况的发生因为它甚至不会编译存在数据竞争的代码
数据竞争会导致未定义行为,这种行为很可能超出我们的预期,难以在运行时追踪并且难以诊断和修复。而Rust避免了这种情况的发生因为它甚至不会编译存在数据竞争的代码
很多时候,大括号可以帮我们解决一些编译不通过的问题,通过手动限制变量的作用域:
```rust
@ -192,7 +192,7 @@ error[E0502]: cannot borrow `s` as mutable because it is also borrowed as immuta
| -- immutable borrow later used here 不可变借用在这里使用
```
其实这个也很好理解,借用不可变的用户,肯定不希望他借用的东西,被另外一个人莫名其妙改变了。多个不可变借用被允许是因为没有人会去试图修改数据,然后导致别人的数据被污染。
其实这个也很好理解,正在借用不可变引用的用户,肯定不希望他借用的东西,被另外一个人莫名其妙改变了。多个不可变借用被允许是因为没有人会去试图修改数据,每个人都只读这一份数据而不做修改,因此不用担心数据被污染。
> 注意引用的作用域s从创建开始一直持续到它最后一次使用的地方这个跟变量的作用域有所不同变量的作用域从创建持续到某一个花括号`}`
@ -212,7 +212,7 @@ fn main() {
// 新编译器中r3作用域在这里结束
```
在老的编译器中Rust 1.31前),将会报错,因为`r1`和`r2`的作用域在花括号`}`处结束,那么`r3`的借用就会触发**无法同时借用可变和不可变**的规则。
在老版本的编译器中Rust 1.31前),将会报错,因为`r1`和`r2`的作用域在花括号`}`处结束,那么`r3`的借用就会触发**无法同时借用可变和不可变**的规则。
但是在新的编译器中,该代码将顺利通过,因为**引用作用域的结束位置从花括号变成最后一次使用的位置**,因此`r1`借用和`r2`借用在`println!`后,就结束了,此时`r3`可以顺利借用到可变引用。
@ -225,7 +225,7 @@ fn main() {
### 悬垂引用Dangling References
所谓悬垂指针是其指向的内存可能已经被分配给其它持有者。相比之下,在 Rust 中编译器确保引用永远也不会变成悬垂状态:当你拥有一些数据的引用,编译器确保数据不会在其引用之前离开作用域
悬垂引用也叫做悬垂指针,指的是指针指向某个值后,这个值被释放掉了,而指针仍然存在,其指向的内存可能不存在任何值或已被其它变量重新使用。在 Rust 中编译器可以确保引用永远也不会变成悬垂状态:当你拥有一些数据的引用,编译器可以确保数据不会在其引用之前被释放,要想释放数据,必须先停止其引用的使用
让我们尝试创建一个悬垂引用Rust会抛出一个编译时错误
@ -258,7 +258,7 @@ help: consider using the `'static` lifetime
```
错误信息引用了一个我们还未介绍的功能生命周期lifetimes。[该章](../../advance/lifetime.md)会详细介绍生命周期。不过,如果你不理会生命周期部分,错误信息中确实包含了为什么这段代码有问题的关键信息:
错误信息引用了一个我们还未介绍的功能生命周期lifetimes。[该章](../../advance/lifetime.md)会详细介绍生命周期。不过,即使你不理解生命周期,也可以通过错误信息知道这段代码错误的关键信息:
```text
this function's return type contains a borrowed value, but there is no value for it to be borrowed from.

Loading…
Cancel
Save