【发布时间】:2017-10-05 00:05:22
【问题描述】:
在 C 中,for 循环有一个可选的增量部分,在 Rust 中我有时会错过:
for (uint i = 0; i < max; i = step_function(i, j, k)) {
/* many lines of code! */
}
这可以用 Rust 写成:
let mut i: u32 = 0;
while (i < max) {
//
// many lines of code!
//
i = step_function(i, j, k);
}
...但是如果continue 存在于“多行代码” 中的某处,这将引入错误。我个人的偏好也是将增量保持在循环的顶部。
如果不创建一个特殊的迭代器来处理这个问题,有没有一种方法可以更紧密地匹配 C 风格的循环,同时解决上面提到的两个问题?
“特殊迭代器”是指不必在 for 循环之外定义迭代器类型和方法。
虽然这看起来像是一个人为的要求,但必须为一次性使用定义一个迭代器 - 在读取和编写代码时都会增加一些开销。
虽然@kennytm 的回答展示了可重用的StepByFn 迭代器如何工作,但使用闭包会为代码添加一些原本不存在的约束。
【问题讨论】:
-
我不确定这是否真的是一个骗局,但stackoverflow.com/questions/27893223/… 会给你答案。
-
这个例子没有使用自定义步长,它是由任意函数步进的,使得上面的例子没有那么密切的关系。 (
step_by不能用来代替step_function用法)。 -
你需要什么样的约束而闭包不能覆盖?即你有一些具体的例子吗?
-
@kennytm,过去使用闭包 - 您可以在块的主体中使用一些表达式,这会在闭包中产生错误。毫无疑问,有很多方法可以解决大多数情况——但这使得移植代码的过程变得不那么简单。因此询问是否可以使用 C 风格的循环。当然,使用宏(
cfor板条箱)也有优缺点,因此需要权衡解决方案 - 也许是为了获得 C 代码的初始端口,使用cfor宏对于例如稍后的代码是有意义的之后(一旦测试到位)可以变得更加质朴。
标签: loops rust control-flow