延长变量的寿命

SBS*_*STP 5 lifetime rust

我正在尝试从函数内部构建的向量中返回一个切片。显然,这是行不通的,因为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()
}
Run Code Online (Sandbox Code Playgroud)

huo*_*uon 4

您不能强制延长值的生命周期;您只需返回完整的Vec. 如果我可以问,你为什么要返回切片本身?它几乎总是不必要的,因为 aVec可以很便宜地(从简单的语法和运行时的低开销的意义上来说)强制转换为切片。

或者,您可以返回迭代器:

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))
}
Run Code Online (Sandbox Code Playgroud)

现在,您必须使用迭代器特征对象,因为闭包具有不可命名的类型。

注意。我必须将filter闭包更改为 capture-by-move (move关键字)以确保它可以返回,否则name变量将直接传递到闭包指针到 的find堆栈帧中,因此将被限制离开find