我想编写一个从迭代器中获取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()
}
}
这不起作用。有两个原因:
IntoIter::into_iter
需要self
,但IntoChars::into_chars
需要&self
。这是因为我不想在不必要地调用&str
方法时使用into_chars
。有没有办法实现这两个目标?IntoChars::into_chars
取self
。这仍然不起作用;我得到: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`
。那为什么会有冲突?我能以任何方式实现这一目标吗?