Есть ли способ создать псевдоним типа std :: slice :: Iter? - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь создать псевдоним типа 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 голосов
/ 17 января 2019

Я предполагаю, что Rust просто выводит параметр времени жизни для Iter в контексте параметра функции. Но, как намекнул E_net4 в своем комментарии , Iter, который вы, вероятно, используете, определяется как Iter<'a, T: 'a>. Правильное определение типа:

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