Продлить время жизни переменной

Я пытаюсь вернуть фрагмент из вектора, который встроен в мою функцию. Очевидно, это не работает, потому что vСрок жизни истекает слишком рано. Мне интересно, есть ли способ продлить vПожизненная Я хочу вернуть простой фрагмент, а не вектор.

pub fn find<'a>(&'a self, name: &str) -> &'a[&'a Element] {
    let v: Vec<&'a Element> = self.iter_elements().filter(|&elem| elem.name.borrow().local_name == name).collect();
    v.as_slice()
}

1 ответ

Решение

Вы не можете принудительно продлить срок жизни значения; вам просто нужно вернуть полный Vec, Если я могу спросить, почему вы хотите вернуть сам ломтик? Это почти всегда не нужно, так как Vec может быть дешево (как в смысле простого синтаксиса, так и с минимальными издержками во время выполнения) приведен к фрагменту.

В качестве альтернативы вы можете вернуть итератор:

use std::iter;

pub fn find<'a>(&'a self, name: &str) -> Box<Iterator<Item = &'a Element> + 'a> {
    Box::new(self.iter_elements()
       .filter(move |&elem| elem.name.borrow().local_name == name))
}

На данный момент вам придется использовать объект-черту итератора, поскольку у замыкания есть типы, которые нельзя назвать.

NB. Я должен был изменить filter закрытие для захвата на ходу (move ключевое слово), чтобы гарантировать, что он может быть возвращен, или же name переменная будет просто передана в указатель закрытия в findстека кадра, и, следовательно, будет запрещено покидать find,

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