为什么Split类型只返回& str,即使Pattern有& str和char的实现?

时间:2018-05-14 15:03:36

标签: generics rust iterator traits associated-types

我很难理解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已实现&strchar

为什么Split类型不能简单地定义为Split<'a, &'a str>,因为它实际上是Iterator而不是&str?为什么它的行为好像被有效地定义为?

1 个答案:

答案 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