2017-10-05 73 views
2
impl Rate for Vec<VolumeRanged> { 
    fn costs<'a, I>(&'a self, issues: &I, period: u32) -> Box<'a + Iterator<Item = f32>> 
    where 
     I: IntoIterator<Item=f32>, 
     I::IntoIter: 'a 
    { 
     fn issue_cost(issue: f32, percentage: f32, constant: f32, max: f32) -> f32 { 
      let r = issue * percentage/100.0 + constant; 
      match r.partial_cmp(&max) { 
       Some(Less) => r, 
       _ => max 
      } 
     } 
     Box::new(issues.into_iter().map(|i| { 
      let (pr, nr) = pairwise(self) 
         .find(|&(_, n)| in_range(&i, &n.range)) 
         .expect("No range found"); 
      issue_cost(
       i, 
       nr.percentage, 
       pr.map_or(0.0, |x| x.max), 
       nr.max, 
      ) 
     })) 
    } 
} 

鏽說如何關閉正確地定義壽命

error[E0373]: closure may outlive the current function, but it borrows `self`, which is owned by the current function 
    --> src/main.rs:43:41 
    | 
43 |   Box::new(issues.into_iter().map(|i| { 
    |           ^^^ may outlive borrowed value `self` 
44 |    let (pr, nr) = pairwise(self) 
    |          ---- `self` is borrowed here 
    | 
help: to force the closure to take ownership of `self` (and any other referenced variables), use the `move` keyword 
    | 
43 |   Box::new(issues.into_iter().map(move |i| { 
    |          ^

但我不想要移動到所有權關閉。我想要的是,返回的盒裝迭代器應該生存的時間長度爲selfissues。一旦他們離開 - 它應該消失。

我知道這可以通過將克隆的迭代器傳遞給issues而不是引用它來解決,我不認爲這是需要的。

playground

回答

1

添加move於封閉。 self的類型爲&Vec<VolumeRanged>,因此閉包不會接受向量的所有權,它將捕獲向量的引用。

+0

我想我已經說過爲什麼我不想這樣做。 – user1685095

+0

只要「問題」和「自我」都應該生活,而不是相反。 – user1685095

+0

生命週期註釋不會改變實際生命週期。添加'move'將會阻止您引用已釋放的向量,就這些了。不添加'move'將不允許程序編譯,因爲閉包捕獲了函數參數'self'的引用,它只存在於一個函數中。 – red75prime