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

时间:2019-01-17 14:54:25

标签: rust lifetime type-alias

我正在尝试创建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中编程时,还没有完全理解这个概念)

1 个答案:

答案 0 :(得分:2)

我假设Rust只是在函数参数上下文中推断Iter的生命周期参数。但是作为E_net4 hinted at in their comment,您可能正在使用的Iter被定义为Iter<'a, T: 'a>。正确的类型定义是:

type MyIterator<'a> = &'a mut Peekable<Iter<'a, MyStruct>>;