繁体   English   中英

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

[英]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同时为&strchar实现,所以我不知道它是如何发生的。

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

该类型具有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> ,因为它实际上是对&strIterator

因为迭代器是惰性的。 Split结构仍需要了解模式才能匹配下一项。 它的迭代器实例具有Item = &str ,因为这是对其进行迭代的内容。


[1]实际的实现是由宏生成的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM