From 9c904a8322bfe9b90760b53c6f59c167e4be940e Mon Sep 17 00:00:00 2001 From: Jesse <35264598+JesseAtSZ@users.noreply.github.com> Date: Wed, 12 Jan 2022 17:35:26 +0800 Subject: [PATCH] Update flow-control.md --- book/contents/basic/flow-control.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/contents/basic/flow-control.md b/book/contents/basic/flow-control.md index 356e9d40..9a9384b0 100644 --- a/book/contents/basic/flow-control.md +++ b/book/contents/basic/flow-control.md @@ -101,7 +101,7 @@ for 元素 in 集合 { ``` 这个语法跟`javascript`还蛮像,应该挺好理解。 -注意,使用`for`时我们往往使用集合的引用形式,除非你不想在后面的代码中继续使用该集合(比如我们这里使用了container的引用。如果不使用引用的话,所有权会被转移到`for`语句块中,后面就无法再使用这个集合了): +注意,使用`for`时我们往往使用集合的引用形式,除非你不想在后面的代码中继续使用该集合(比如我们这里使用了container的引用)。如果不使用引用的话,所有权会被转移到`for`语句块中,后面就无法再使用这个集合了): ```rust for item in &container { // ... @@ -160,7 +160,7 @@ for item in collection { ``` 第一种方式是循环索引,然后通过索引下标去访问集合,第二种方式是直接循环集合中的元素,优劣如下: -- **性能**:第一种使用方式中`collection[index]`的索引访问,会因为边界检查(bounds checking)导致运行时的性能损耗 - for循环每次运行时,Rust会检查并确认`index`是否落在集合内,但是第二种直接迭代的方式就不会触发这种检查,因为编译器会在编译时就完成分析并证明这种访问是合法的 +- **性能**:第一种使用方式中`collection[index]`的索引访问,会因为边界检查(bounds checking)导致运行时的性能损耗 - for循环每次运行时,会检查并确认`index`是否落在集合内,但是第二种直接迭代的方式就不会触发这种检查,因为编译器会在编译时就完成分析并证明这种访问是合法的 - **安全**:第一种方式里对`collection`的索引访问是非连续的,存在一定可能性在两次访问之间,`collection`发生了变化,导致脏数据产生。而第二种直接迭代的方式是连续访问,因此不存在这种风险(这里是因为所有权吗?是的话可能要强调一下) 由于for循环无需任何条件限制,也不需要通过索引来访问,因此是最安全也是最常用的,通过与下面的`while`的对比,我们能看到为什么`for`会更加安全。