|
|
|
@ -2,7 +2,7 @@
|
|
|
|
|
|
|
|
|
|
80后应该都对学校的小混混记忆犹新,在那个时代,小混混们往往都认为自己是地下王者,管控着地下事务的流程,在我看来,他们就像代码中的流程控制一样,无处不在,很显眼,但是又让人懒得重视。
|
|
|
|
|
|
|
|
|
|
言归正传,(<--觉得从这之前的内容有点啰嗦QWQ)Rust程序是从上而下顺序执行的,在此过程中,我们可以通过循环、分支等流程控制方式,更好的实现相应的功能。
|
|
|
|
|
言归正传,Rust程序是从上而下顺序执行的,在此过程中,我们可以通过循环、分支等流程控制方式,更好的实现相应的功能。
|
|
|
|
|
|
|
|
|
|
## 使用if来做分支控制
|
|
|
|
|
> if else无处不在 - `鲁迅说`
|
|
|
|
@ -46,7 +46,7 @@ error[E0308]: if and else have incompatible types
|
|
|
|
|
6 | | } else {
|
|
|
|
|
7 | | "six"
|
|
|
|
|
8 | | };
|
|
|
|
|
| |_____^ expected integer, found &str // 期望整数类型,但却发现&str字符串切片,与if分支的返回类型不一致
|
|
|
|
|
| |_____^ expected integer, found &str // 期望整数类型,但却发现&str字符串切片
|
|
|
|
|
|
|
|
|
|
|
= note: expected type `{integer}`
|
|
|
|
|
found type `&str`
|
|
|
|
@ -160,7 +160,7 @@ for item in collection {
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
第一种方式是循环索引,然后通过索引下标去访问集合,第二种方式是直接循环集合中的元素,优劣如下:
|
|
|
|
|
- **性能**:第一种使用方式中`collection[index]`的索引访问,会因为边界检查(bounds checking)导致运行时的性能损耗 - for循环每次运行时,会检查并确认`index`是否落在集合内,但是第二种直接迭代的方式就不会触发这种检查,因为编译器会在编译时就完成分析并证明这种访问是合法的
|
|
|
|
|
- **性能**:第一种使用方式中`collection[index]`的索引访问,会因为边界检查(bounds checking)导致运行时的性能损耗 - Rust会检查并确认`index`是落在集合内,但是第二种直接迭代的方式就不会触发这种检查,因为编译器会在编译时就完成分析并证明这种访问是合法的
|
|
|
|
|
- **安全**:第一种方式里对`collection`的索引访问是非连续的,存在一定可能性在两次访问之间,`collection`发生了变化,导致脏数据产生。而第二种直接迭代的方式是连续访问,因此不存在这种风险(这里是因为所有权吗?是的话可能要强调一下)
|
|
|
|
|
|
|
|
|
|
由于for循环无需任何条件限制,也不需要通过索引来访问,因此是最安全也是最常用的,通过与下面的`while`的对比,我们能看到为什么`for`会更加安全。
|
|
|
|
|