Rust 如何在将引用返回到外部引用的过滤向量时安抚借用检查器

Rust 如何在将引用返回到外部引用的过滤向量时安抚借用检查器,rust,borrow-checker,Rust,Borrow Checker,我正在尝试实现一个查找函数,该函数将返回对self值中包含的值的可变引用。通常,由于返回的参考点指向lookup函数(self.verts)之外的数据,因此借阅检查器认为这没有问题。然而,在我的例子中,我在返回引用并将其绑定到新的自有名称之前过滤self.verts。当我尝试从本地拥有的数组返回值时,我得到编译时错误: 错误:`vs`寿命不够长 -->src/util/graph.rs:18:37 | 18 | if vs.len()>0{Some(&mut vs[0])}else{None}

我正在尝试实现一个查找函数,该函数将返回对
self
值中包含的值的可变引用。通常,由于返回的参考点指向
lookup
函数(
self.verts
)之外的数据,因此借阅检查器认为这没有问题。然而,在我的例子中,我在返回引用并将其绑定到新的自有名称之前过滤self.verts。当我尝试从本地拥有的数组返回值时,我得到编译时错误:

错误:`vs`寿命不够长
-->src/util/graph.rs:18:37
|
18 | if vs.len()>0{Some(&mut vs[0])}else{None}
|^^^活得不够长
19 |     }
|-借来的价值仅在此处有效
|
注意:借用值必须在16:75时主体上定义的生命周期“a”内有效。。。
-->src/util/graph.rs:16:76
|
16 | pub fn lookup_id Option=self.verts.iter_mut().filter(|x | x.id==id.collect();
如果vs.len()>0{Some(&mut vs[0])}其他{None}
}

此代码无法编译,因为
vs的寿命不够长
。如何告诉编译器a希望返回
vs
中包含的引用,而不是
vs
中的引用?

您返回的是
&mut&mut Vertex

如果要丢弃其余元素,可以执行惰性计算:

self.verts.iter_mut().filter(|x | x.id==id).next()

我怀疑类似于
的东西&mut&mut-Vertex
。不幸的是,在
vs
前面没有
&mut
的情况下,还有其他几个编译器错误。事实证明,Rust在索引时返回引用,这是我不知道的。我必须检查
std::vec
模块,发现
remove()
直接返回值。此代码适用于:

pub fn lookup_id(&mut self, id: &str) -> Option<&mut Vertex> {
    let mut vs:Vec<&mut Vertex> = self.verts.iter_mut().filter(|x| x.id == id).collect();
    if vs.len() > 0 { Some(vs.remove(0)) } else { None }
}
pub fn lookup\u id(&mut self,id:&str)->选项{
让mut vs:Vec=self.verts.iter_mut().filter(|x | x.id==id.collect();
如果vs.len()>0{Some(vs.remove(0))}其他{None}
}
但是,此版本要干净得多:

pub fn lookup_id(&self, id: &str) -> Option<&Vertex> {
    self.verts.iter().find(|x| x.id == id)
}
pub fn lookup\u id(&self,id:&str)->选项{
self.verts.iter().find(|x | x.id==id)
}
pub fn lookup_id(&self, id: &str) -> Option<&Vertex> {
    self.verts.iter().find(|x| x.id == id)
}