rust - 有没有办法创建 std::slice::Iter 的类型别名?

标签 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 编程)

最佳答案

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

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

关于rust - 有没有办法创建 std::slice::Iter 的类型别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54238520/

相关文章:

c++ - 在 C++ 中更改对象的动态类型

rust - Rust 时间线和所有权问题

scala - 如何实现行为相同但不能一起使用的类型别名

rust - cargo 中的自定义 cfg 目标?

rust - `pub` 是表示 public-to-crate 还是 public-to-module?

rust - 如何从带有 &mut self 的方法中调用带有 self 的方法

rust - 如何将方法传递给需要静态生命周期参数的函数?

swift - 在 MusicSequenceUserCallback 中传递的函数参数

c++ - 带有类型别名的函数指针参数

string - 如何将字符串 "[1, 2, 3]"转换为 Vec<u8>?