具有& str和寿命的索引特征

时间:2017-10-08 14:56:51

标签: rust

我正在尝试为生命周期和斗争的结构实现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>

1 个答案:

答案 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()