gpt4 book ai didi

rust - 无法将 core::slice::Iter 解析为 core::iter::Iterator?

转载 作者:行者123 更新时间:2023-11-29 07:49:52 31 4
gpt4 key购买 nike

我正在尝试用 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 成为引用而不是类型参数的错误。但是,它不是开始的类型参数。那是什么?

我在这里做错了什么?关于我的代码,Rust 试图告诉我什么?

最佳答案

There's a couple things that are confusing about this error message.

你是对的,这是一个很难解析的消息。

it seems like Rust isn't able to resolve a core::slice::Iter as 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 中使用相同的定义 block 。

Here's a Playground with your definition fixed , 和一个空的 main()所以它会编译。

关于rust - 无法将 core::slice::Iter 解析为 core::iter::Iterator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48910588/

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