2017-12-04 19 views
7

Mã này biên dịch và làm việc, nhưng theo sự hiểu biết của tôi, nó không nên biên dịch:Tại sao cuộc đời này bị ràng buộc gây ra lỗi?

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

Thời gian tồn tại của biến s là trong main, nhưng chức năng test có một ràng buộc mà S phải 'static. Tôi nghĩ rằng tuổi thọ của biến số s phải là 'static hoặc lớn hơn 'static. Có gì sai với lý do của tôi?

Trả lời

11

Các ràng buộc S: 'a có nghĩa là bất kỳ tài liệu tham khảo chứa trong S phải sống ít nhất là miễn phí 'a. Đối với S: 'static, điều này có nghĩa là các tham chiếu trong S phải có thời lượng là 'static. Loại String không chứa bất kỳ tham chiếu nào (nó sở hữu dữ liệu của nó) và do đó mã biên dịch.

Trích dẫn the book:

loại mà không cần bất kỳ tài liệu tham khảo tính là T: 'static. Vì 'static có nghĩa là tham chiếu phải tồn tại miễn là toàn bộ chương trình, một loại không chứa tham chiếu đáp ứng tiêu chí của tất cả các tham chiếu miễn là toàn bộ chương trình (vì không có tham chiếu).

Nếu bạn gọi hàm với test(&s) thay vào đó, 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... 

Ở đây, S&'a String đối với một số đời 'a, và tuổi thọ bị ràng buộc đòi hỏi 'a phải 'static, mà không phải là trường hợp.

Các vấn đề liên quan