我试图用Rust编写一个简单的迭代器:
#[derive(Debug)]
pub struct StackVec<'a, T: 'a> {
storage: &'a mut [T],
len: usize,
_head: usize,
}
impl<'a, T> IntoIterator for StackVec<'a, T> {
type Item = T;
type IntoIter = core::slice::Iter<'a, T>;
fn into_iter(self) -> core::slice::Iter<'a, T> {
self.storage.iter()
}
}但是,在试图编译它时,我得到了以下错误:
error[E0271]: type mismatch resolving `<core::slice::Iter<'_, T> as core::iter::Iterator>::Item == T`
--> src/lib.rs:135:13
|
135 | impl<'a, T> IntoIterator for StackVec<'a, T> {
| ^^^^^^^^^^^^ expected reference, found type parameter
|
= note: expected type `&T`
found type `T`
error: aborting due to previous error
error: Could not compile `stack-vec`.关于这条错误消息,有几件事令人困惑。首先,Rust似乎无法将core::slice::Iter解析为core::iter::Iterator。但是,core::slice::Iter是一个迭代器,对吗?为什么这些类型不匹配?
其次,我看到了一个错误,期望IntoIterator是一个引用而不是类型参数。但是,它不是一个类型参数。那是怎么回事?
我在这里做错什么了?罗斯特想告诉我什么关于我的密码?
发布于 2018-02-21 19:00:56
关于这条错误消息,有几件事令人困惑。
你是完全正确的,这是一个很难分析的信息。
似乎Rust无法将
core::slice::Iter解析为core::iter::Iterator
你大错特错了:你漏掉了一些尖括号,错误地分析了信息。(我说了很难解析!)让我们看一下这条信息,并突出了一些关键的括号:
type mismatch resolving `<core::slice::Iter<'_, T> as core::iter::Iterator>::Item == T`
(________________________________________________)问题不是将core::slice::Iter<'_, T>解析为core::iter::Iterator,而是解决等式,其中整个表达式<core::slice::Iter<'_, T> as core::iter::Iterator>::Item位于左侧。整个混乱的名称只有一个类型:它是通过使用as运算符将core::slice::Iter<'_, T>向上转换为core::iter::Iterator,然后获取它的Item成员而得到的类型。
特征IntoIterator的定义如下:
pub trait IntoIterator where
<Self::IntoIter as Iterator>::Item == Self::Item也就是说,要实现这个特性,您需要满足给定的需求。这是编译器所抱怨的要求。您已经将Item定义为T,IntoIter定义为core::slice::Iter<'_, T>,但将这两个定义放入其中并不能满足等式的要求。
换句话说,要实现IntoIterator,您需要定义一个Item类型,它需要与基础迭代器的Item类型相同。core::slice::Iter<'a, T>定义其Item类型如下:
type Item = &'a T因此,您需要在impl块中使用相同的定义。
这是一个你定义固定的游乐场,以及一个空的main(),这样它就会编译。
发布于 2018-02-21 16:24:03
首先,铁锈似乎无法解析核心::片::iter作为核心::iter::Iterator。但是,核心::片::Iter是一个迭代器,对吗?为什么这些类型不匹配?
你错过了信息的关键部分:
类型失配分解
<std::slice::Iter<'_, T> as std::iter::Iterator>::Item == T
它不能将它解析为一个迭代器,它的Item类型为T。
这是因为slice::Iter是引用的迭代器,而不是值。
https://stackoverflow.com/questions/48910588
复制相似问题