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

|

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