mirror of
https://github.com/RustyCab/LearnRustEasy.git
synced 2026-02-03 18:23:31 +08:00
Update chapter_3_7_2.md
This commit is contained in:
@@ -42,7 +42,7 @@ fn print(s: String) -> String {
|
||||
|
||||

|
||||
|
||||
获取变量的引用,称之为借用。通过借用,允许使用被引用变量绑定的值,同时又没有移动该变量的所有权。前面的示例代码可以变成如下:
|
||||
**获取变量的引用,称之为借用** 。通过借用,允许使用被引用变量绑定的值,同时又没有移动该变量的所有权。前面的示例代码可以变成如下:
|
||||
```Rust
|
||||
fn main() {
|
||||
let s2 = String::from("hello");
|
||||
@@ -114,7 +114,7 @@ fn change(some_string: &mut String) {
|
||||
} // 花括号之前为a的作用域结束位置
|
||||
```
|
||||
|
||||
引用的作用域和变量的作用域有些区别,在老版本编译器(Rust 1.31 之前)中,引用的作用域和变量的作用域一样,也是从定义的位置开始到花括号之前结束,如下:
|
||||
引用的作用域和变量的作用域有些区别,**在老版本编译器(Rust 1.31 之前)中,引用的作用域和变量的作用域一样,也是从定义的位置开始到花括号之前结束**,如下:
|
||||
```Rust
|
||||
{
|
||||
...
|
||||
@@ -123,7 +123,7 @@ fn change(some_string: &mut String) {
|
||||
....
|
||||
}// 花括号之前为r的作用域结束位置
|
||||
```
|
||||
在新版本编译器中,引用作用域的结束位置从花括号变成最后一次使用的位置,如下:
|
||||
**在新版本编译器中,引用作用域的结束位置从花括号变成最后一次使用的位置**,如下:
|
||||
```Rust
|
||||
{
|
||||
...
|
||||
@@ -135,7 +135,7 @@ fn change(some_string: &mut String) {
|
||||
```
|
||||
|
||||
- 使用可变引用的限制
|
||||
(1)限制一:同一作用域,特定数据只能有一个可变引用。如下代码会报错:
|
||||
(1)限制一:**同一作用域,特定数据只能有一个可变引用**。如下代码会报错:
|
||||
```Rust
|
||||
fn main() {
|
||||
let mut s1 = String::from("hello");
|
||||
@@ -177,7 +177,7 @@ fn main() {
|
||||
}
|
||||
```
|
||||
|
||||
(2)限制二:同一作用域,可变引用和不可变引用不能同时存在。如下代码编译错误:
|
||||
(2)限制二:**同一作用域,可变引用和不可变引用不能同时存在**。如下代码编译错误:
|
||||
```Rust
|
||||
fn main() {
|
||||
let mut s = String::from("hello");
|
||||
@@ -203,9 +203,9 @@ fn main() {
|
||||
} // 老编译器中: r1、r2、r3的作用域都是在花括号之前结束
|
||||
```
|
||||
|
||||
Rust这样设计的原因:
|
||||
**Rust这样设计的原因**:
|
||||
|
||||
通过此设计,防止同一时间对同一数据存在多个可变引用。 这样Rust 在编译时就避免了数据竞争。数据竞争(data race)类似于竞态条件,它可由这三个行为造成:
|
||||
通过此设计,防止同一时间对同一数据存在多个可变引用。 这样Rust 在编译时就避免了数据竞争。**数据竞争(data race)** 类似于竞态条件,它可由这三个行为造成:
|
||||
|
||||
- 两个或更多指针同时访问同一数据。
|
||||
- 至少有一个指针被用来写入数据。
|
||||
|
||||
Reference in New Issue
Block a user