Заимствование и внутренний IntoIterator

Хоть я и поумнел с жизнями, но компилятор меня снова учит...

ошибка [E0521]: заимствованные данные выходят за пределы метода

играть


pub struct Bugger<S> {
    pub items: S,
}
impl<S> Bugger<S>
where
    &'static S: IntoIterator + 'static,
    <&'static S as IntoIterator>::Item: AsRef<u8>,
{
    fn do_something_with_items(&self) -> impl  Iterator<Item = u8> {
        (&self.items).into_iter().map(|b| *b.as_ref())
    }
}

Я хочу принять общий член, который реализует IntoIterator по своей ссылке, а затем использовать его в другом методе, на самом деле это черта, но даже это терпит неудачу.

Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основная причина, по которой это не удается скомпилировать, заключается в том, что вы берете &self (который должен быть действителен для любого времени жизни), но привязка блока реализации требует, чтобы IntoIterator был реализован для ссылки со временем жизни 'static. Таким образом, способ использования этой привязки в методе требует, чтобы ссылка &self также была 'static, но вы этого не указали. Вы можете исправить этот конкретный пример, используя метод &'static self.

Однако, скорее всего, это не то, что вам нужно. Скорее всего, вы хотите, чтобы жизнь была короче 'static. Вы можете описать это с помощью признака, связанного с признаком более высокого ранга (HRTB).

Вам также необходимо указать в возвращаемом типе, что возвращаемый итератор заимствован у self, что можно сделать, добавив анонимное время жизни '_ к границе.

pub struct Bugger<S> {
    pub items: S,
}

impl<S> Bugger<S>
where
    for<'a> &'a S: IntoIterator,
    for<'a> <&'a S as IntoIterator>::Item: AsRef<u8>,
{
    fn do_something_with_items(&self) -> impl Iterator<Item = u8> + '_ {
        (&self.items).into_iter().map(|b| *b.as_ref())
    }
}

(Детская площадка)

Обратите внимание, что время жизни анонима — это всего лишь синтаксический сахар:

fn do_something_with_items<'a>(&'a self) -> impl Iterator<Item = u8> + 'a

Следующий уровень... более высокий рейтинг. Спасибо!

Robert Cutajar 17.03.2024 17:28

Другие вопросы по теме