gpt4 book ai didi

rust - 创建向上或向下步进的迭代器

转载 作者:行者123 更新时间:2023-11-29 08:10:56 24 4
gpt4 key购买 nike

理想情况下,我希望有如下内容:

iter = if go_up {
(min .. limit)
} else {
(limit .. max).rev()
};

创建一个迭代器,根据情况向上或向下计数到某个限制。但是,因为 RangeRev 是不同的类型,所以我不能这样做。我可以使用 step_by 功能,但因为我的限制是无符号数据类型,所以我还必须强制转换所有内容。到目前为止我最好的是:

#![feature(step_by)]
iter = if go_up {
(min as i64 .. limit as i64).step_by(1)
} else {
(limit as i64 .. max as i64).step_by(-1)
};

但这既需要不稳定的特性,又需要我的类型。似乎应该有一种更简洁的方法来做到这一点;有人认识吗?

最佳答案

直接的解决方案是简单地创建一个可以向上或向下计数的迭代器。使用 enum 在类型之间进行选择:

use std::ops::Range;
use std::iter::Rev;

enum Foo {
Upwards(Range<u8>),
Downwards(Rev<Range<u8>>),
}

impl Foo {
fn new(min: u8, limit: u8, max: u8, go_up: bool) -> Foo {
if go_up {
Foo::Upwards(min..limit)
} else {
Foo::Downwards((limit..max).rev())
}
}
}

impl Iterator for Foo {
type Item = u8;

fn next(&mut self) -> Option<Self::Item> {
match *self {
Foo::Upwards(ref mut i) => i.next(),
Foo::Downwards(ref mut i) => i.next(),
}
}
}

fn main() {
for i in Foo::new(1, 5, 10, true) {
println!("{}", i);
}

for i in Foo::new(1, 5, 10, false) {
println!("{}", i);
}
}

另一种引入一点间接的实用解决方案是 Box 迭代器:

fn thing(min: u8, limit: u8, max: u8, go_up: bool) -> Box<Iterator<Item = u8>> {
if go_up {
Box::new(min..limit)
} else {
Box::new((limit..max).rev())
}
}

fn main() {
for i in thing(1, 5, 10, true) {
println!("{}", i);
}

for i in thing(1, 5, 10, false) {
println!("{}", i);
}
}

关于rust - 创建向上或向下步进的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34374980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com