2017-12-04 10 views
7

このコードはコンパイルして、仕事が、私の理解によると、それはコンパイルべきではありません。このライフタイムバウンドでエラーが発生するのはなぜですか?

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

変数sの寿命はmainであるが、機能testS'staticでなければならないという限界があります。変数sの有効期間は'static以上、または'static以上である必要があります。私の推論で何が間違っていますか?

答えて

11

バインドされたS: 'aは、Sに含まれるすべての参照が少なくとも'aの長さでなければならないことを意味します。 S: 'staticの場合、Sの参照には'staticの有効期間が必要です。 String型は参照を保持していません(データを所有している)ので、コードはコンパイルされます。 the book引用

:すべての参照なし

タイプはT: 'staticとしてカウントされます。 'staticは、参照がプログラム全体と同じくらい長くなければならないことを意味するため、参照が含まれない型は、参照番号がないため、すべての参照の基準を満たしています。

あなたの代わりにtest(&s)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... 

Sは、いくつかの生涯'aため&'a Stringあり、そして結合寿命がされていない、'a'staticでなければならないことを要求場合。

関連する問題