【问题标题】:Is there a way to create a type alias of a std::slice::Iter?有没有办法创建 std::slice::Iter 的类型别名?
【发布时间】:2019-01-17 14:54:24
【问题描述】:

我正在尝试创建 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

我也试过了:

  • ... = &amp;'a Peekable&lt;Iter&lt;&amp;'a MyStruct&gt;&gt;;
  • ... = &amp;'a Peekable&lt;Iter&lt;MyStruct+ 'a&gt;&gt;;

即使在MyStruct 中添加生命周期参数时,也不起作用。我真的不明白 Rust 想让我如何定义生命周期参数。 (总的来说,我还没有完全理解这个概念,因为我刚开始用 Rust 编程)

【问题讨论】:

  • 您是否有特殊原因试图在类型别名中推送引用,而不是将别名定义为 Peekable&lt;Iter&lt;MyStruct&gt;&gt; 并将 &amp;mut MyIterator 作为参数?
  • 您还没有指定您所说的Iter,标准库中有几种具有该名称的类型(例如std::slice::Iter)。不过,请注意,每个标准数据都有一个生命周期参数,用于跟踪原始数据的生命周期。
  • @E_net4wisheshappyholidays 不好意思,我把它添加到问题中了。
  • @MatthieuM。哦,主要原因是它应该始终是一个可变引用,因为我想始终调用 next 方法。即使我从类型别名中省略了它,它也会抱怨生命周期参数。
  • Iter 需要在别名中指定生命周期:type MyIterator&lt;'a&gt; = Peekable&lt;Iter&lt;'a, MyStruct&gt;&gt;; 在这一点上,我认为您不需要将其设为可变引用。

标签: rust lifetime type-alias


【解决方案1】:

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

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

【讨论】:

  • 哦,好尴尬,我看的是Peekable的定义,而不是Iter。现在可以了,谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多