5分钟速读之Rust权威指南(四)

297 阅读2分钟

流程控制

通过条件来执行或重复执行某些代码是编程语言的基础组成部分。在Rust中用来控制程序执行流的结构主要就是if表达式与循环表达式。

if表达式

JS中的if后边需要加括号,而Rust非常精简:

let num = 5;
// 条件无需带括号
if num < 10 {
  println!("小于10");
}

判断条件只能是布尔值:

if num { // 报错,条件需要是布尔值
  println!("true");
}

rust中判断两值是相等或不等使用==和≠,而JS中使用===和≠=:

// 判断等于0
if num == 0 {
  println!("0");
}

// 判断不等于0时
if num != 0 {
  println!("not 0");
}

配合 else if 和 else 处理流程分支:

if num < 10 {
    println!("小于10")
} else if num < 20 {
    println!("小于20")
} else if num < 30 {
    println!("小于30")
} else {
    println!("大于30")
}

使用if表达式对变量赋值

因为if属于表达式,所以具有返回值:

let condition = 1;
let foo = if condition >= 1 {
  5
} else {
  6
};
foo // 5

分支中的表达式返回值需要是相同的类型,否则会报错:

let foo = if condition >= 1 {
  5
} else {
  '6' // 报错:预期一个整数,却得到了字符char
};

与函数的返回值规则一样,表达式的最后一句也不能跟分号,加分号会认为返回空元组:

let foo = if condition >= 1 {
  5
} else {
  6; // 报错:预期一个整数,却得到了空元组:()
};

循环

loop

使用loop重复执行代码:

loop {
  println!("无限循环")
}

利用条件退出循环:

let mut count = 0;
loop {
  println!("{}", count);
  if count >= 3 {
    break;
  }
  count += 1;
}
// 1
// 2
// 3

loop循环是具有返回值的:

let mut count = 0;
let result = loop {
  if count >= 3 {
    break count; // 使用break返回值
  }
  count += 1;
};
println!("{}", result);
// 3

while

使用while进行有条件地循环:

let mut count = 0;
while count <= 3 {
  count += 1;
  println!("{}", count);
}
// 1
// 2
// 3
// 4

用loop实现while:

let mut count = 0;
loop {
  if count <= 3 {
    count += 1;
    println!("{}", count);
  } else {
    break;
  }
}
// 1
// 2
// 3
// 4

for

一般使用for循环来遍历各种集合:

let arr = [1, 2, 3];
// arr.iter()会返回一个迭代器,相当于JS中的:arr[Symbol.iterator]()
// 所以for循环只能遍历拥有迭代器的集合
for item in arr.iter() {
  println!("{}", item)
}
// 1
// 2
// 3

用while实现for循环:

let arr = [1,2,3];
let mut index = 0;
while index < arr.len() {
  println!("{}", arr[index]);
  index += 1;
}

for循环还支持遍历区间,包前不包后:

for num in 1..3 {
  println!("{}", num);
}
// 1
// 2

事实上区间是rust中的一个类型,可以反转:

// 使用rev()函数将1, 2, 3反转为3, 2, 1
for num in (1..3).rev() {
  println!("{}", num);
}
// 3
// 2

我们发现rust中是不支持像JS中的那种能够对指针进行控制的循环的:

for (let i = 0; i <= 6; i++) {
  console.log(i)
	if (i <= 3) {
    i++
  }
}
// 0
// 2
// 4
// 5
// 6

在rust中需要用while循环来实现:

let mut i = 0; // 初始值
while i <= 6 { // 判断条件
  println!("{}", i);
  if i <= 3 {
    i += 1
  }
  i += 1; // 累加值
}
// 0
// 2
// 4
// 5
// 6