有没有一种方法可以创建std :: slice :: Iter的类型别名?

3
我正在尝试创建一个Peekable slice::Iter的类型别名,但编译器一直在抱怨我需要一个生命周期参数。
这个迭代器在多个地方使用,总是遍历相同的类型。为了使代码更加简洁,我想使用一个类型别名。
我已经尝试过以下方法(下面是代码示例):
  • 向它正在迭代的结构体添加一个生命周期参数,并将其作为泛型的参数传递,但没有成功。
  • 在迭代器内部添加一个生命周期参数
use std::{iter::Peekable, slice::Iter};

pub struct MyStruct {
    pub arg1: i32,
    pub arg2: i32,
    pub arg3: MyEnum,
}

pub enum MyEnum {
    Default,
}

// mutable since I want to call .peek() and .next() on my iterator
type MyIterator<'a> = &'a mut Peekable<Iter<MyStruct>>;

请注意,如果我不使用类型别名,即在代码中直接使用它,则上述内容完全正常:
pub fn my_fn(it: &mut Peekable<Iter<MyStruct>>) -> i32 { /* ... */ }

我一直收到以下错误信息:
error[E0106]: missing lifetime specifier
  --> src/lib.rs:14:40
   |
14 | type MyIterator<'a> = &'a mut Peekable<Iter<MyStruct>>;
   |                                        ^^^^^^^^^^^^^^ expected lifetime parameter

我也尝试过以下代码:
  • ... = &'a Peekable<Iter<&'a MyStruct>>;
  • ... = &'a Peekable<Iter<MyStruct+ 'a>>;
但是两者都不起作用,即使在MyStruct中添加生命周期参数。我不太明白Rust希望我如何定义生命周期参数。(一般来说,由于我刚开始使用Rust编程,我还没有完全理解这个概念)

你为什么要在类型别名中推送引用,而不是将别名定义为 Peekable<Iter<MyStruct>> 并将 &mut MyIterator 作为参数呢? - Matthieu M.
您没有指定您所说的是哪个Iter,标准库中有几种具有该名称的类型(例如std::slice::Iter)。尽管如此,请注意每个标准库中的迭代器都有一个生命周期参数,用于跟踪原始数据的生命周期。 - E net4
@E_net4祝您节日快乐,我的错,我把它添加到问题中了。 - Joël Abrahams
@MatthieuM。主要的原因是它应该始终是一个可变引用,因为我想始终调用next方法。即使我从类型别名中省略它,它仍然会抱怨有一个生命周期参数。 - Joël Abrahams
在别名中需要指定生命周期:type MyIterator<'a> = Peekable<Iter<'a, MyStruct>>; 目前我认为您不需要将其变为可变引用。 - E net4
是的,我也发现如果这样做会出现多个可变借用的问题。 - Joël Abrahams
1个回答

2
我假设Rust只是在函数参数上下文中推断Iter的生命周期参数。但是,正如E_net4在他们的评论中所暗示的那样,你可能正在使用定义为Iter<'a, T: 'a>Iter。正确的类型定义是:
type MyIterator<'a> = &'a mut Peekable<Iter<'a, MyStruct>>;

哦,真尴尬,我看了Peekable的定义而不是Iter。现在它可以工作了,谢谢! - Joël Abrahams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接