我正在尝试从函数内部构建的向量中返回一个切片。显然,这是行不通的,因为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)
您不能强制延长值的生命周期;您只需返回完整的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。