我很难理解Split
类型在Rust中是如何工作的。
Split<'a, P> where P: Pattern<'a>
是std::string::String::split
方法返回的类型。该类型具有Iterator<'a, P>
的实现,其中P
仍然是Pattern
类型,但实际上(正如我所料)Iterator
仅返回&str
切片。
例如,split(p).collect::<Vec<&str>>()
有效但split(p).collect::<Vec<char>>()
会导致编译错误。这是我期望发生的事情,但我不明白它是如何发生的,因为Pattern
已实现&str
和char
。
为什么Split
类型不能简单地定义为Split<'a, &'a str>
,因为它实际上是Iterator
而不是&str
?为什么它的行为好像被有效地定义为?
答案 0 :(得分:3)
该类型具有
的实现Iterator<'a, P>
没有。它只是Iterator
,没有类型参数。 Iterator
的每个实现都必须使用关联类型声明它迭代的项的类型。例如,Split
的实现 [1] 是这样的:
impl <'a, P> Iterator for Split<'a, P> {
type Item = &'a str;
fn next(&mut self) -> Option<&'a str> { ... }
}
为什么
Split
类型不能简单地定义为Split<'a, &'a str>
,因为它实际上是Iterator
而不是&str
?
因为迭代器是懒惰的。 Split
结构仍然需要知道模式以匹配下一个项目。它的迭代器实例有Item = &str
,因为它是迭代的。
[1] 实际实施是generated by a macro。