延长变量的生命周期

Extend lifetime of variable

我正在尝试 return 从我的函数中内置的向量中切片。显然这是行不通的,因为 v 的生命周期过早了。我想知道是否有办法延长 v 的寿命。我想要 return 普通切片,而不是矢量。

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()
}

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

或者,您可以 return 迭代器:

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))
}

现在,您将不得不使用迭代器特征对象,因为闭包具有无法命名的类型。

注意。我必须将 filter 闭包更改为移动捕获(move 关键字)以确保它可以被 returned,否则 name 变量只会传递到 find 的堆栈帧中的闭包指针,因此将被限制离开 find.