「Rust 流程控制」for

「这是我参与11月更文挑战的第 6 天,活动详情查看:2021最后一次更文挑战


程序按理说是从上到下执行,除非你不希望这样。Rust有一套有用的流控制机制来促进这一点。本节将简要介绍其基本原理。

For

可以说是迭代操作中核心的核心语法。

for循环是Rust中迭代的核心。迭代值的集合,包括迭代可能有无限多的值的集合。其基本形式:

1
2
3
rust复制代码for item in container {
// ...
}

这种基本形式使得容器中每个连续的元素都可以作为 item。通过这种方式,Rust以一种易于使用的高级语法模拟了许多动态语言。然而,它也有一些隐患。

反常的是,一旦块结束,再次访问容器就变得无效了。即使容器变量仍然在本地范围内,它的生命周期也已经结束。Rust假定一旦 Block 结束,就不再需要容器了

当你想在以后的程序中重复使用容器时,可以使用引用。当不使用引用时,Rust假定不再需要容器。要给容器添加一个引用,请在它前面加上这个(&),如本例所示:

1
2
3
rust复制代码for item in &container {
// ...
}

如果你需要在循环过程中修改item,你可以通过包含mut关键字来使用一个可变的引用:

1
2
3
rust复制代码for item in &mut collection {
// ...
}

作为一个实现细节,Rust的for循环结构被编译器扩展为方法调用。如下表所示,这三种形式的for分别映射到不同的方法。

简写 转换写法 访问性
for item in collection for item in IntoIterator::into_iter(collection) Ownership
for item in &collection for item in collection.iter() Read-only
for item in &mut collection for item in collection.iter_mut() Read-write

当局部变量不在一个块内使用时,按照惯例,你会使用下划线(_)*。*将这种模式与 exclusive range syntax (n..m)和 inclusive range syntax (n..=m)结合起来使用,可以清楚地看出其目的是为了执行一个固定次数的循环。下面是一个例子:

1
2
3
rust复制代码for _ in 0..10 {
// ...
}

在许多编程语言中,通过使用一个临时变量来循环处理事情是很常见的,该变量在每次迭代结束时都会被递增。传统上,这个变量被命名为i(代表索引)。如下:

1
2
3
4
5
rust复制代码let collection = [1, 2, 3, 4, 5];
for i in 0..collection.len() {
let item = collection[i];
// ...
}

上面代码可以通过编译。在不能通过对集合中的项目进行直接迭代的情况下,这也是必要的。然而,一般来说,这是不可取的。手动方法会带来两个问题:

性能

用collection[index]语法索引值会产生运行时的边界检查费用。也就是说,Rust检查索引当前是否存在于集合中的有效数据。当直接在集合上进行迭代时,这些检查是没有必要的。编译器可以使用编译时分析来证明非法访问是不可能的。

安全性

随着时间的推移,定期访问集合会带来它已经改变的可能性。直接在集合上使用for循环可以让Rust保证集合不被程序的其他部分所触及。

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%