![](/img/trans.png)
[英]mypy complains: function type annotation with Type[TypeVar['T', str, date]] and T output: Incompatible return value type (got "str", expected "date")
[英]Why does the Split type only return &str even though Pattern has implementations for both &str and char?
我很难理解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>
,因为它实际上是对&str
的Iterator
? 为什么它的行为好像被有效地定义为那样?
该类型具有
Iterator<'a, P>
没有。 只是Iterator
,没有类型参数。 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>
,因为它实际上是对&str
的Iterator
?
因为迭代器是惰性的。 Split
结构仍需要了解模式才能匹配下一项。 它的迭代器实例具有Item = &str
,因为这是对其进行迭代的内容。
[1]实际的实现是由宏生成的 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.