Rust 延长变量的生命周期
我试图从构建在函数中的向量返回一个切片。显然,这不起作用,因为Rust 延长变量的生命周期,rust,lifetime,Rust,Lifetime,我试图从构建在函数中的向量返回一个切片。显然,这不起作用,因为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.b
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()
}
pub fn find&'a[&'a元素]{
让v:Vec你不能强制延长一个值的生存期;你只需要返回完整的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))
}
使用std::iter;
酒馆fn查找框{
框::新的(self.iter_元素()
.filter(move |&elem | elem.name.borrow().local_name==name))
}
现在,您必须使用迭代器trait对象,因为闭包具有不可度量的类型
注意:我不得不将过滤器
闭包更改为通过移动捕获(关键字move
)为了确保它可以被返回,或者name
变量只会被传递到find
的堆栈框架中的闭包指针中,因此会被限制离开find
我想返回一个只读列表。我想我需要的是一个ownedsicle,但那可能只是Vec。我不能返回一个ite因为我希望它是可索引的。由于Vec
(或任何东西)包含&元素
,列表的实际内容是只读的,就像使用&[]
一样。返回Vec
而不是&[]
只允许用户修改该向量的长度(例如,push
/pop
元素),这通常是不必要的,尤其是在Rust中,Vec
s等是唯一拥有的,因此更改Vec
不会在其他任何地方更改任何值。此外,您可以返回迭代器:如果用户绝对需要多次随机访问它,那么他们可以手动.collect()
。如果他们只希望按顺序迭代,或者随机索引一次(可能通过nth
),那么返回迭代器可能会更有效,因为元素只会根据需要生成。当然,如果结构通常是随机访问的,那么要求collect
只会让事情变得更详细。(我刚刚意识到我在编写迭代器建议时犯了一个错误。正在修复。)