延长变量的生命周期
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
.
我正在尝试 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
.