我在a repo中有以下代码:
impl<Id> IdAllocator<Id> where
Id : Clone + Default + Add<u32, Id>,
{
pub fn new() -> IdAllocator<Id> {
IdAllocator {
next: Default::default()
}
}
// Produce an Id that hasn't been produced yet by this object.
pub fn allocate(&mut self) -> Id {
let ret = self.next.clone();
self.next = self.next + 1;
ret
}
}
但它看起来有点笨拙,特别是因为Add
实例仅用作succ
函数(按顺序生成下一个值)。我可以使用一些Succ
课程吗?如果是这样,标准库中的某个Iterator
构造是否已经有Default
+ Succ
模式吗?
谢谢!
答案 0 :(得分:3)
不,遗憾的是,标准库中没有Succ
之类的东西。您可以找到最接近的事物是range()
迭代器系列,但它使用Add
和One
数字特征来生成项目。你可以这样做(这个想法与你的基本相同,但由于One
特征用法,这个版本稍微更通用):
use std::num::One;
use std::default::Default;
struct IdAllocator<T> {
current: T
}
impl<T: Default> IdAllocator<T> {
#[inline]
pub fn new() -> IdAllocator<T> {
IdAllocator {
current: Default::default()
}
}
}
impl<T: Add<T, T>+One+Clone> Iterator<T> for IdAllocator<T> {
fn next(&mut self) -> Option<T> {
let next = self.current + One::one();
self.current = next.clone();
Some(next)
}
}
fn main() {
let a = IdAllocator::<uint>::new();
for i in a.take(10) {
println!("{}", i);
}
}
(试试here)