您将如何在Rust中编写与此C ++循环等效的内容

时间:2018-09-02 18:18:59

标签: loops syntax rust iteration

Rust的for循环与C风格的语言略有不同。我试图找出是否可以在Rust中以类似的方式在下面实现相同的结果。 注意条件,其中i ^ 2

for (int i = 2; i * i < n; i++)
{
    // code goes here ...
}

3 个答案:

答案 0 :(得分:12)

您始终可以将文字转换为while循环。

let mut i = 2;
while i * i < n {
    // code goes here
    i += 1;
}

您还可以始终在无限范围内编写for循环并在任意条件下爆发:

for i in 2.. {
    if i * i >= n { break }
    // code goes here
}

对于这个特定的问题,您也可以使用take_while,但我不知道这实际上比打破for循环更具可读性。作为更长的“组合器”链的一部分,这将更有意义。

for i in (2..).take_while(|i| i * i < n) {
    // code goes here
}

答案 1 :(得分:4)

zwol's answertake_while建议是最惯用的,因此通常是最佳选择。有关循环的所有信息都保存在一个表达式中,而不是混入循环主体中。

但是,最快实现是预先计算n的平方根(实际上是一种奇怪的四舍五入的平方根)。这样您就可以避免每次迭代都进行比较,因为您知道这始终是i的最终值。

let m = (n as f64 - 0.5).sqrt() as _;
for i in 2 ..= m {
    // code goes here
}

作为旁注,我尝试对这些不同的循环进行基准测试。 take_while是最慢的。我刚才建议的版本总是报告0 ns/iter,但我不确定这是否是由于某些代码被优化到根本无法运行,还是真的太快而无法测量。对于大多数用途而言,区别并不重要。

答案 2 :(得分:0)

更新:自从编写此答案以来,我已经了解了更多Rust。在某些罕见情况下(例如,循环中的逻辑需要有条件地更改计数器变量的情况),该结构仍然有用,但是通常您会想要使用范围表达式,如zwol所说。


我喜欢这种形式,因为它使增量保持在循环的顶部而不是底部:

let mut i = 2 - 1;    // You need to subtract 1 from the initial value.
loop {
    i+=1; if i*i >= n { break }

    // code goes here...
}