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