2017-10-05 13 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, 
      ) 
     })) 
    } 
} 

Rust ditComment définir des durées de vie correctement dans la fermeture

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| { 
    |          ^

Mais je ne veux pas passer la propriété dans la fermeture. Ce que je veux, c'est que itérateur retourné en boîte devrait vivre aussi longtemps que les deux self et issues. Dès qu'ils partent - il devrait disparaître.

Je sais que cela peut être résolu en passant l'itérateur cloné à issues au lieu d'une référence, je ne pense pas que ce soit nécessaire ici.

playground

Répondre

1

Ajouter move à la fermeture. self a le type &Vec<VolumeRanged>, donc la fermeture ne prendra pas la propriété du vecteur, elle capturera la référence au vecteur.

+0

Je pense que j'ai déjà dit pourquoi je ne veux pas faire ça. – user1685095

+0

C'est la fermeture qui devrait vivre aussi longtemps que «problèmes» et «soi», pas l'inverse. – user1685095

+0

Les annotations à vie ne modifient pas les durées de vie réelles. Ajouter 'move' vous empêchera d'avoir une référence au vecteur désalloué, c'est tout. Ne pas ajouter 'move' ne permet pas à un programme de compiler, car closure capture la référence au paramètre de fonction' self', qui n'existe que dans une fonction. – red75prime