2015-06-10 20 views
13

Tôi muốn triển khai trình xây dựng tương tự như gỡ lỗi builders được xác định bởi thư viện chuẩn. Chúng được định nghĩa sử dụng các cấu trúc như sau:Có phải <'a, 'b: 'a> có nghĩa là tuổi thọ 'b phải vượt xa tuổi thọ' a?

struct DebugFoo<'a, 'b: 'a> { 
    fmt: &'a mut std::fmt::Formatter<'b> 
} 

Vì tôi không hiểu những gì các hình thức <'a, 'b: 'a> phương tiện cũng không phải tôi có thể thấy nó được đề cập trong cuốn sách Rust hoặc tham chiếu Rust (ít nhất là liên quan đến tuổi thọ), tôi chỉ cố gắng để loại bỏ những gì tôi không hiểu để xem những gì sẽ xảy ra:

struct DebugFoo<'a, 'b> { 
    fmt: &'a mut std::fmt::Formatter<'b> 
} 

Biên soạn nó tôi nhận được lỗi này:

in type `&'a mut core::fmt::Formatter<'b>`, reference has a longer 
lifetime than the data it references 

Và ghi chú này:

the pointer is valid for the lifetime 'a as defined on the struct at 1:0 
but the referenced data is only valid for the lifetime 'b as defined on 
the struct at 1:0 

Nó làm cho ý nghĩa với tôi: 'a'b là kiếp sống khác nhau như vậy, để được ở bên an toàn, Rust (? Các checker mượn) giả định rằng 'a sẽ sống lâu hơn 'b, và ném lỗi.

Bây giờ tôi có thể đoán rằng <'a, 'b: 'a> có nghĩa là tuổi thọ 'b phải dài hơn tuổi thọ 'a. Tôi đoán đúng không? Hoặc có nhiều hơn? Làm cách nào tôi có thể tìm thấy tài liệu đó?

Trả lời

16

Ruột già được đọc "outlives", do đó

'long: 'short 

được đọc "'long outlives 'short".

Đối với một tài liệu chính thức về chủ đề, nơi duy nhất tôi đã xem tài liệu cho đến thời điểm này là ở số RFC on lifetime bounds.

8

Có, bạn hoàn toàn đúng.

Một ràng buộc <...: 'a> có nghĩa là ... (loại hoặc vòng đời khác) cần có khả năng sống lâu hơn 'a. Ví dụ. 'b: 'a có nghĩa là "'b phải sống ít nhất là miễn là 'a" (không phải là ngoại lệ nghiêm ngặt, mặc dù: chúng có thể giống nhau).

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