延长变量的寿命

时间:2015-03-02 22:38:26

标签: rust lifetime

我试图从我的函数内部构建的向量中返回一个切片。显然这不起作用,因为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 个答案:

答案 0 :(得分:3)

你不能强行延长价值的生命周期;你只需要返回完整的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-by-move(move关键字)以确保可以返回它,否则name变量将只传递给闭包指针进入find的堆栈框架,因此将被限制为离开find