2017-12-04 138 views
7

Bu kod derler ve iş, ama benim anlayışıma göre, bu derleme olmamalıdır:Bu ömür boyu neden bir hataya neden olmaz?

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

değişken s yaşam boyu main olmakla fonksiyon testS'static olması gerektiğini bir sınır vardır. Bence s değişkeninin ömrü 'static veya 'static'dan daha büyük olmalıdır. Benim mantığımın nesi var?

cevap

11

S: 'a numaralı bağ, S'da bulunan tüm başvuruların en az 'a kadar uzun süre yaşaması gerektiği anlamına gelir. S: 'static için, bu S'deki referansların 'static kullanım ömrüne sahip olması gerektiği anlamına gelir. String türünde herhangi bir referans (veriye sahip değil) bulunur ve bu nedenle kod derlenir. the book aktaran

: herhangi bir referans olmaksızın

Türleri T: 'static olarak sayılır. 'static, başvurunun tüm program kadar uzun süre kalması gerektiği anlamına geldiğinden, herhangi bir referans içermeyen bir tür, tüm programın tamamında (referans olmadığı için) tüm referansların kriterlerini karşılar.

yerine test(&s) ile işlevini, compilation will fail çağırırsanız: Burada

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... 

, S bazı ömür boyu 'a için &'a String ve bağlı ömür 'a olmadığı, 'static olması gerektiğini gerektirir vaka.