我很难理解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
是?为什么它的行为就好像它被有效地定义为那样?
最佳答案
The type has an implementation for
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> { ... }
}
Why isn't the
Split
type simply defined asSplit<'a, &'a str>
, since it is effectively anIterator
over&str
s?
因为迭代器是惰性的。 Split
struct 仍然需要了解模式才能匹配下一个项目。它的迭代器实例有 Item = &str
,因为这就是它迭代的内容。
[1]实际实现是 generated by a macro .
关于generics - 为什么 Split 类型只返回 &str 即使 Pattern 具有 &str 和 char 的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50333526/