2017-10-08 13 views
1

は私が寿命と闘争を持つ構造体のIndex形質を実装しようとしています。 &strで内部ベクトルをインデックス可能にしたい。私。 myqstr["foo"]インデックス&STRと特性と寿命

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() 
    } 
} 

、エラーが古典である:ここでは

は、私が得たものです。私はIndexを理解

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 

は、インデックス付き構造の借り値を返すために私を望んでいる、と私は'aが何であるかを私が返すようにしたいの寿命を知っているが、この場合にあっても可能ですか?あなたは間違った場所に参照を取っている

答えて

3

、あなたの.map関数内の参照をしたいです。

Vecにあるパラメータへの参照が必要なためです。

また

self.params.iter() 
    .rev() 
    .find(|p| p.name == index) 
    .unwrap() 
+0

感謝を行うことが容易になるだろう! rev()ゼロコストですか?私は効率が欲しいのですか? –

+0

はい、 '.rev()は'だけで、それが効率的ですので、明示的にいずれかの末端から反復することができるタイプのために存在します。 – loganfsmyth

+0

@MartinAlgestenは、はい、それはゼロコストです。 'REV()私はタイプ出力'に変更したい場合は、 ''だけDoubleEndedIterator's ​​ – red75prime