gpt4 book ai didi

generics - 为什么Iterator 和Iterator 的实现有冲突?

转载 作者:行者123 更新时间:2023-12-03 11:32:07 25 4
gpt4 key购买 nike

此代码无法编译:

pub trait ToVec<T> {
fn to_vec(self) -> Vec<T>;
}

impl<I, T> ToVec<T> for I
where
I: Iterator<Item = T>,
{
fn to_vec(self) -> Vec<T> {
self.collect()
}
}

impl<'a, I, T> ToVec<T> for I
where
I: Iterator<Item = &'a T>,
T: Clone,
{
fn to_vec(self) -> Vec<T> {
self.cloned().collect()
}
}
错误:
error[E0119]: conflicting implementations of trait `ToVec<_>`:
--> src/lib.rs:14:1
|
5 | / impl<I, T> ToVec<T> for I
6 | | where
7 | | I: Iterator<Item = T>,
8 | | {
... |
11 | | }
12 | | }
| |_- first implementation here
13 |
14 | / impl<'a, I, T> ToVec<T> for I
15 | | where
16 | | I: Iterator<Item = &'a T>,
17 | | T: Clone,
... |
21 | | }
22 | | }
| |_^ conflicting implementation
据我了解,当给定类型的 I实现 Iterator时, I::Item只能具有一种特定的类型,因此无法同时满足这两种实现。
这是编译器的局限性还是我的推理不正确?如果是这样,请提供同时满足这两个要求的示例。

最佳答案

我相信这是问题#20400,Can't write non-overlapping blanket impls that involve associated type bindings。总而言之,impl实际上是不重叠的,但是教导编译器认识到这会引入否定推理的形式,这与特质求解器当前的工作方式大不相同。 An RFC是为了解决此问题而编写的,但由于对两种类型重叠的含义含糊不清而部分推迟了。
该问题似乎最终将得到重新解决,但可能需要一些时间。
同时,您可以根据向Trait添加类型参数来编写变通方法,就像我对Can I avoid eager ambiguity resolution for trait implementations with generics?的回答一样(尽管在您的情况下,由于impl从未真正重叠,因此您不必使用turbofish来选择impl ;编译器应始终将其弄清楚。)

关于generics - 为什么Iterator <Item = T>和Iterator <Item =&T>的实现有冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66241700/

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