for-loop - 有没有办法做一个既不是迭代也不是线性的for循环?

标签 for-loop rust

我可以写一个 Rust for 循环等同于这个 C 代码吗:

for(int i = 2; i <= 128; i=i*i){
    //do something
}

我只看到类似的东西

for i in 0..128 { /* do something */ }

let v = vec![0, 1, 2, /* ... */ ];
for i in v.iter() { /* do something */ }

我应该只使用 while 循环吗?

最佳答案

您可以始终创建一个自定义迭代器来执行您需要的任何唯一序列:

struct Doubling {
    current: u64,
    max: u64,
}

impl Iterator for Doubling {
    type Item = u64;

    fn next(&mut self) -> Option<Self::Item> {
        if self.current > self.max {
            None
        } else {
            let v = Some(self.current);
            self.current *= 2;
            v
        }
    }
}

fn main() {
    let iter = Doubling { current: 2, max: 128 };
    let values: Vec<_> = iter.collect();
    println!("{:?}", values);
}

重要的是要认识到,当值加倍超出类型的大小时,这种逻辑(就像原来的 C!)有讨厌的边缘情况。


在这种特殊情况下,您还可以认识到您有一个指数级数:

fn main() {
    let iter = (1..8).map(|p| 2i32.pow(p));
    let values: Vec<_> = iter.collect();
    println!("{:?}", values);
}

如果您想真正体验一下,请查看 Lazy sequence generation in Rust .改编于此:

#![feature(generators, generator_trait, conservative_impl_trait)]

use std::ops::{Generator, GeneratorState};

fn doubling(mut start: u64, max: u64) -> impl Iterator<Item = u64> {
    GeneratorIteratorAdapter(move || {
        while start <= max {
            yield start;
            start *= 2;
        }
    })
}

fn main() {
    let iter = doubling(2, 128);
    let sum: Vec<_> = iter.collect();
    println!("{:?}", sum);
}

/* copy-pasta */
struct GeneratorIteratorAdapter<G>(G);

impl<G> Iterator for GeneratorIteratorAdapter<G>
where
    G: Generator<Return = ()>,
{
    type Item = G::Yield;

    fn next(&mut self) -> Option<Self::Item> {
        match self.0.resume() {
            GeneratorState::Yielded(x) => Some(x),
            GeneratorState::Complete(_) => None,
        }
    }
}

关于for-loop - 有没有办法做一个既不是迭代也不是线性的for循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49030578/

相关文章:

python - Python 中的 Levenshtein 距离循环

rust - Piston 创建一个多个正方形的 block

rust - 在 Rust 中将字符串搜索到 Vec<String>

sqlite - 如何用 cargo 编译 rusqlite 0.20.0

postgresql - 使用 plpgsql 的 FOR LOOP 控件中的 SELECT 子句

c++ - 基于范围的for循环将对象 move 到另一个容器中?

windows - 使批处理文件 FOR 命令在没有通配符的情况下工作?

Python for 循环 - 为什么这不是无限循环?

rust - 什么是 'core::kinds::Sized` 没有为 rust 中的 `Self' 类型实现?

rust - 如何修复 "use of extern prelude names introduced with ` extern crate` 项目不稳定”