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

标签 generics rust iterator traits associated-types

我很难理解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/

相关文章:

arrays - 要求数组是 Swift 协议(protocol)中的最小大小

java - 使用泛型将集合添加到 HashMap

rust tokio trait bound 在 forward 方法上不满足

module - 如何从模块中引用其父范围内的模块成员?

pointers - 如何将 Rust 结构的引用/指针传递给 C ffi 接口(interface)?

c++ - 为什么我不能使用列表迭代器逻辑比较运算符?

javascript - 预期的标识符、字符串或数字,带 *[Symbol.iterator]

来自键盘输入的 C++ 通用数据

java - 它不会抛出异常 ConcurrentModificationException

generics - 内联映射函数 (Functor)