gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:06:02 24 4
gpt4 key购买 nike

我很难理解 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 as Split<'a, &'a str>, since it is effectively an Iterator over &strs?

因为迭代器是惰性的。 Split struct 仍然需要了解模式才能匹配下一个项目。它的迭代器实例有 Item = &str ,因为这是它迭代的内容。


[1]实际执行是generated by a macro .

关于generics - 为什么 Split 类型只返回 &str,即使 Pattern 具有 &str 和 char 的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50333526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com