2017-12-29 14 views
0

Ich spiele herum mit der lifetime Komplexität in Rost und ich landete den folgenden Code schreiben:Legendes Refs in Rost, wenn struct und es ist Mitglied hat unterschiedliche Lebensdauer

trait Boss<'a, 'c> { 
    fn work(&self, &'a i32) -> &'c i32; 
} 

struct Human<'c> { 
    i:&'c i32 
} 

impl<'a, 'b, 'c> Boss<'a, 'c> for &'b Human <'c> { 
    fn work(&self, v:&'a i32) -> &'c i32 { 
    &self.i 
    } 
} 


fn main() { 
    let h = Human {i:&1}; 
} 

Dieser Code kompiliert, aber ich bin nicht sicher, Warum. Wie ich es verstehe, hat die &Human Lebensdauer von 'b, während das Referenzelement i von struct Human'c hat. Warum beschwert sich der Compiler nicht darüber, dass 'b'c überleben kann?

Antwort

0

h : Human<'static> und 'static Referenzen erfüllen alle Anforderungen an die Ausgangslebensdauer.

Versuchen Sie, Code zu schreiben, bei dem auf eine Variable mit kürzerer Lebensdauer als h verweist.

fn main() { 
    let mut h = Human {i:&1}; 
    { 
     let x : i32 = 3; 
     h.i = &x; 
    } 
    let r = (&h).work(&3); 
} 

error[E0597]: `x` does not live long enough 
    --> a.rs:21:5 
    | 
20 |   h.i = &x; 
    |    - borrow occurs here 
21 |  } 
    | ^`x` dropped here while still borrowed 
22 |  let r = (&h).work(&3); 
23 | } 
    | - borrowed value needs to live until here 
Verwandte Themen