首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法解析核心::片::iter作为核心::iter::Iterator?

无法解析核心::片::iter作为核心::iter::Iterator?
EN

Stack Overflow用户
提问于 2018-02-21 16:16:22
回答 2查看 962关注 0票数 5

我试图用Rust编写一个简单的迭代器:

代码语言:javascript
复制
#[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()
    }
}

但是,在试图编译它时,我得到了以下错误:

代码语言:javascript
复制
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是一个引用而不是类型参数。但是,它不是一个类型参数。那是怎么回事?

我在这里做错什么了?罗斯特想告诉我什么关于我的密码?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-21 19:00:56

关于这条错误消息,有几件事令人困惑。

你是完全正确的,这是一个很难分析的信息。

似乎Rust无法将core::slice::Iter解析为core::iter::Iterator

你大错特错了:你漏掉了一些尖括号,错误地分析了信息。(我说了很难解析!)让我们看一下这条信息,并突出了一些关键的括号:

代码语言:javascript
复制
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的定义如下:

代码语言:javascript
复制
pub trait IntoIterator where
    <Self::IntoIter as Iterator>::Item == Self::Item

也就是说,要实现这个特性,您需要满足给定的需求。这是编译器所抱怨的要求。您已经将Item定义为TIntoIter定义为core::slice::Iter<'_, T>,但将这两个定义放入其中并不能满足等式的要求。

换句话说,要实现IntoIterator,您需要定义一个Item类型,它需要与基础迭代器的Item类型相同。core::slice::Iter<'a, T>定义其Item类型如下:

代码语言:javascript
复制
type Item = &'a T

因此,您需要在impl块中使用相同的定义。

这是一个你定义固定的游乐场,以及一个空的main(),这样它就会编译。

票数 7
EN

Stack Overflow用户

发布于 2018-02-21 16:24:03

首先,铁锈似乎无法解析核心::片::iter作为核心::iter::Iterator。但是,核心::片::Iter是一个迭代器,对吗?为什么这些类型不匹配?

你错过了信息的关键部分:

类型失配分解<std::slice::Iter<'_, T> as std::iter::Iterator>::Item == T

它不能将它解析为一个迭代器,它的Item类型为T

这是因为slice::Iter是引用的迭代器,而不是值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48910588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档