Продлить время жизни переменной
Я пытаюсь вернуть фрагмент из вектора, который встроен в мою функцию. Очевидно, это не работает, потому что 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
,