Rust包装类型的范围



是否可以使用自定义结构作为范围?

例如:

struct Wrap(u32);
fn main() {
let x = Wrap(0);
(x..).take(10);
}

给我

1 | struct Wrap(u32);
| ----------- doesn't satisfy `Wrap: Step`

CCD_ 1是一种实验性API。那么,在正常的Rust中是不可能的吗?

..语法使用Range,只有当底层类型实现Step时,它才能实现迭代器,而Step又要求您实现ClonePartialOrd,因此还需要实现PartialEq

可能,但目前仅在夜间实现Step

#![feature(step_trait)]
use std::iter;
#[derive(Clone, PartialEq, PartialOrd, Debug)]
struct Wrap(u32);
// Forward implementation to underlying u32
impl iter::Step for Wrap {
fn steps_between(start: &Self, end: &Self) -> Option<usize> {
u32::steps_between(&start.0, &end.0)
}
fn forward_checked(start: Self, count: usize) -> Option<Self> {
u32::forward_checked(start.0, count).map(Wrap)
}
fn backward_checked(start: Self, count: usize) -> Option<Self> {
u32::backward_checked(start.0, count).map(Wrap)
}
}
fn main() {
let x = Wrap(0);
let values = (x..).take(10).collect::<Vec<_>>();
assert_eq!(values, vec![Wrap(0), Wrap(1), Wrap(2), Wrap(3), Wrap(4), Wrap(5), Wrap(6), Wrap(7), Wrap(8), Wrap(9)]);
}

游乐场

最新更新