你会如何在Rust中编写这个C++循环的等价物

Mid*_*das 3 iteration syntax loops rust

Rust的for循环与C风格的循环略有不同.我试图弄清楚我是否可以在Rust中以类似的方式获得相同的结果.注意i ^ 2 <n的条件.

for (int i = 2; i * i < n; i++)
{
    // code goes here ...
}
Run Code Online (Sandbox Code Playgroud)

zwo*_*wol 12

您始终可以对while循环进行字面翻译.

let mut i = 2;
while i * i < n {
    // code goes here
    i += 1;
}
Run Code Online (Sandbox Code Playgroud)

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

for i in 2.. {
    if i * i >= n { break }
    // code goes here
}
Run Code Online (Sandbox Code Playgroud)

对于这个特定的问题,你也可以使用take_while,但我不知道如果它实际上比打破for循环更具可读性.作为更长链"组合者"的一部分,它会更有意义.

for i in (2..).take_while(|i| i * i < n) {
    // code goes here
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*all 5

take_while从建议zwol的回答是最地道的,因此,通常的最佳选择。有关循环的所有信息都保存在单个表达式中,而不是混入循环主体中。

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

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

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

  • @trentcl都是。这样,它甚至不需要将“ i”与“ m”进行比较。 (2认同)