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

问题描述 投票:2回答:1

我很难理解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?为什么它的行为好像被有效地定义为?

generics rust iterator traits associated-types
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.