2017-12-04 5 views
7

Dieser Code kompiliert und Arbeit, aber nach meinem Verständnis, sollte es nicht kompilieren:Warum verursacht diese Lebensdauergrenze keinen Fehler?

use std::fmt::Display; 

pub fn test<S>(s: S) 
where 
    S: Display + 'static, 
{ 
    println!("test: {}", s); 
} 

fn main() { 
    let s = String::from("string"); 

    test(s); 
} 

Die Lebensdauer der variablen s in main ist, aber die Funktion test hat ein gebundenes dass S'static sein muss. Ich denke, die Lebensdauer der Variablen s muss 'static oder größer als 'static sein. Was ist los mit meiner Argumentation?

Antwort

11

Die gebundene S: 'a bedeutet, dass alle in S enthaltenen Referenzen mindestens so lange wie 'a leben müssen. Für S: 'static bedeutet dies, dass Referenzen in S eine 'static Lebensdauer haben müssen. Der Typ String enthält keine Referenzen (er besitzt seine Daten), und daher kompiliert der Code.

Zitiert the book:

Typen ohne Referenzen zählen als T: 'static. Denn 'static bedeutet, dass die Referenz so lange leben muss wie das gesamte Programm, ein Typ, der keine Referenzen enthält, erfüllt die Kriterien aller Referenzen, solange das gesamte Programm existiert (da es keine Referenzen gibt).

Wenn Sie rufen Sie die Funktion mit test(&s) stattdessen compilation will fail:

error[E0597]: `s` does not live long enough 
    --> src/main.rs:14:11 
    | 
14 |  test(&s); 
    |   ^does not live long enough 
15 | } 
    | - borrowed value only lives until here 
    | 
    = note: borrowed value must be valid for the static lifetime... 

Hier S ist &'a String für einige Lebensdauer 'a und die Lebensdauer erfordert gebunden, dass 'a'static sein müssen, was nicht der ist Fall.

Verwandte Themen