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
只会让事情变得更详细。(我刚刚意识到我在编写迭代器建议时犯了一个错误。正在修复。)