Rust:创建一个默认和Succ的迭代器?

时间:2014-10-23 20:38:52

标签: iterator rust

我在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模式吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

不,遗憾的是,标准库中没有Succ之类的东西。您可以找到最接近的事物是range()迭代器系列,但它使用AddOne数字特征来生成项目。你可以这样做(这个想法与你的基本相同,但由于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