采取任何可以产生char迭代器的类型,加上& str

时间:2015-09-19 19:46:01

标签: rust

我想编写一个从迭代器中获取tokenize的函数char。像这样:

fn tokenize<F: IntoIterator<Item=char>>(file: F)

如果我想使用&str这个功能,我可以这样做:

tokenize("foo".chars())

这很好用。

现在,我想避免.chars()专门针对&str类型,因为我知道,如果我给了&str,我可以制作这就是我想要的.chars()

我尝试宣布一个新的特性IntoChars,然后为&str实施:

trait IntoChars {
    type T: Iterator<Item=char>;
    fn into_chars(&self) -> Self::T;
}

impl<'a> IntoChars for &'a str {
    type T = Chars<'a>;
    fn into_chars(&self) -> Self::T {
        self.chars()
    }
}

如果那时我的功能是这样的:

tokenize<F: IntoChars>(file: F)

它有效。太好了!但是我想为任何可以给我字符的类型实现IntoChars,即。是IntoIterator<Item=char>

impl<T: IntoIterator<Item=char>> IntoChars for T {
    type T = T::IntoIter;
    fn into_chars(self) -> Self::T {
        self.into_iter()
    }
}

这不起作用。有两个原因:

  1. IntoIter::into_iter需要self,但IntoChars::into_chars需要&self。这是因为我不想在不必要地调用&str方法时使用into_chars。有没有办法实现这两个目标?
  2. 好的,让我们说IntoChars::into_charsself。这仍然不起作用;我得到:error: conflicting implementations for trait `IntoChars` [E0119]。但是,如果我删除impl<'a> IntoChars for &'a str,我会error: the trait `core::iter::Iterator` is not implemented for the type `&str`。那为什么会有冲突?
  3. 我能以任何方式实现这一目标吗?

0 个答案:

没有答案