我正在尝试为生命周期和斗争的结构实现Index
特征。我希望内部向量可以在&str
上进行索引。即myqstr["foo"]
。
这是我得到的:
pub struct QString<'a> {
pub params: Vec<Param<'a>>
}
pub struct Param<'a> {
pub name: &'a str,
pub value: &'a str,
}
impl<'a, 'b> ::std::ops::Index<&'b str> for QString<'a> {
type Output = Param<'a>;
fn index(&self, index: &'b str) -> &Param<'a> {
&self.params.iter()
.rposition(|ref p| p.name == index)
.map(|pos| self.params[pos])
.unwrap()
}
}
错误是经典。
Compiling qstring v0.1.0 (file:///Users/martin/dev/qstring)
error[E0597]: borrowed value does not live long enough
--> src/lib.rs:113:10
|
113 | &self.params.iter()
| __________^
114 | | .rposition(|ref p| p.name == index)
115 | | .map(|pos| self.params[pos])
116 | | .unwrap()
| |_____________________^ does not live long enough
117 | }
| - temporary value only lives until here
|
note: borrowed value must be valid for the anonymous lifetime #1 defined on the method body at 112:5
我理解Index
希望我返回索引结构的借用值,并且我知道我想要返回的生命周期是'a
,但是在这种情况下甚至是可能的吗? / p>
答案 0 :(得分:3)
您在错误的地方使用了引用,您想在.map
函数中获取引用。
self.params.iter()
.rposition(|ref p| p.name == index)
.map(|pos| &self.params[pos])
.unwrap()
因为你想要引用Vec
本身的参数。
它也更容易
self.params.iter()
.rev()
.find(|p| p.name == index)
.unwrap()