rust基础入门[04] - Controlling Execution Flow

本章覆盖有:

  • if语句
  • while语句
  • for语句
  • 变量的有效性范围

Conditional Statements (if)

1
2
let n = 4;
if n > 0 { print!("posistive");}

和其它语言不同的是:

  • 条件部分必须是Boolean类型。诸如if 4 { print!("four"); }是不允许的。
  • 不推荐用括号将条件部分括起来,编译器会报一条警告。
  • 条件语句后面跟着 block是必须的。诸如 if 4 > 0 print!("four");if (4 > 0) print!("four");是不允许的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
let n = 0;
if n > 0 {
print!("number is");
print!(" positive");
} else {
print!("non positive");
}

条件表达式支持嵌套。

## Conditional Expressions

```rust
let n = 4;
print!("{}",
if n > 1000 {
"big"
} else if n > 0 {
"small"
} else if n < 0 {
"negative"
} else {
"neither positive nor negative"
}
);

条件表达式可用于语句中。类似于C-like语言的?:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
int main(int argc, char **argv) {
int n = 4;
printf("%s",
n > 1000 ?
"big" :
n > 0 ?
"small":
n < 0 ?
"negative":
"neither positive nor negative");
)
}

Conditioned Loops (while)

打印1到10的整数,平方的方式,你可以:

1
2
3
4
5
let mut i = 1;
while i <= 10 {
print!("{} ", i * i);
i += 1;
}

可以使用continuebreak,下面写法等价:

1
2
3
4
5
6
7
let mut i = 0;
while i < 50 {
i += 1;
if i % 3 == 0 {continue; }
if i * i > 400 {break;}
print!("{} ", i * i)
}

Infinite Loops(loop)

1
2
3
4
5
6
7
let mut i = 1;
while true {
let ii = i * i;
if ii >= 200 {break;}
print!("{} ", ii);
i += 1;
}

当然编译器会抱怨说:"denote infinite loops with loop {... } "。

1
2
3
4
5
6
7
let mut i = 1;
loop {
let ii = i * i;
if ii >= 200 {break;}
print!("{} ", ii);
i += 1;
}

Couting Loops (for)

1
2
3
for i in 1..11 {
print!("{} ", i * i);
}

如果循环部分中有变量同名,循环语句内的变量被忽略:

1
2
3
let index = 8;
for index in 0..4 {print!("{} ", index); }
print!(":{}", index);

结果将输出: “0 1 2 3 :8”。

让我们看看下面这个例子:

1
2
3
4
5
6
let mut limit = 4;
for i in 1..limit {
limit -= 1;
print!("{} ", i);
}
print!(":{}", limit);

Variables Scopes

变量范围推荐使用语句块的方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
print!("1");
{
print!("2");
print!("3");
{
print!("4");
{
print!("5");
{{}}
print!("6");
}
}
print!("7");
}

变量的范围是有意义的,如果你执行下面的代码,它实际上会得出编译错误:

1
2
{ let i = 10;}
print!("{} ", i);

对于条件语句ifwhilefor,变量的范围仍然支持:

1
2
3
4
5
6
let mut _i = 1;
if true { let _i = 2; }
print!("{} ", _i);

while _i > 0 { _i -= 1; let _i = 5; }
print!("{} ", _i);