Bài học theo mô-đun (1/2)
Tuổi thọ và Tài liệu tham khảo
Trong Rust, mọi tham chiếu đều có thời gian tồn tại, tương ứng với phạm vi mà tham chiếu đó hợp lệ. Trong hầu hết các trường hợp, thời gian tồn tại được trình biên dịch ẩn và suy ra nhờ các quy tắc bỏ chọn thời gian tồn tại. Tuy nhiên, khi mối quan hệ giữa thời gian tồn tại của các tham chiếu khác nhau không rõ ràng, chúng ta phải chú thích chúng một cách rõ ràng.
Mục tiêu chính của vòng đời là ngăn chặn tài liệu tham khảo lơ lửng (tham chiếu đến dữ liệu đã được giải phóng khỏi bộ nhớ).
Cú pháp chú thích trọn đời
Tên trọn đời bắt đầu bằng dấu nháy đơn (') và thường là các chữ cái viết thường ngắn (như 'a). Các chú thích trọn đời không làm thay đổi thời gian tồn tại thực tế của các biến, nhưng chúng chỉ ra cho trình biên dịch mối quan hệ giữa tính hợp lệ của đầu vào và đầu ra.
Ví dụ: nếu một hàm lấy hai tham số tham chiếu chuỗi và trả về một tham chiếu chuỗi và chúng tôi muốn tham chiếu được trả về là hợp lệ miễn là cả hai tham số đầu vào đều hợp lệ, chúng tôi sử dụng:
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}Tuổi thọ trong cấu trúc dữ liệu
Nếu cấu trúc chứa trường là tham chiếu, chúng ta phải chú thích rõ ràng thời gian tồn tại trên tham chiếu đó để đảm bảo rằng phiên bản cấu trúc không thể tồn tại lâu hơn dữ liệu mà nó đề cập đến:
struct ImportantExcerpt<'a> {
part: &'a str,
}
fn main() {
let novel = String::from("Call me Ishmael. Some years ago...");
let first_sentence = novel.split('.').next().unwrap();
let i = ImportantExcerpt {
part: first_sentence,
};
}Tuổi thọ tĩnh
Vòng đời 'static là vòng đời đặc biệt kéo dài trong toàn bộ thời gian của chương trình. Tất cả các chuỗi ký tự bằng chữ (&str) đều có thời gian tồn tại 'static vì chúng được lưu trữ trực tiếp bên trong tệp thực thi nhị phân.
let s: &'static str = "I have a static lifetime.";Hãy tự mình thử
Bài tập 1: Hàm dài nhất
Viết hàm có tên dài nhất<'a> chấp nhận hai tham số, x thuộc loại &'a str và y thuộc loại &'a str và trả về giá trị thuộc loại &'a str. Bên trong hàm, sử dụng khối if/else để trả về x nếu độ dài của nó lớn hơn y, nếu không thì trả về y.
Hiển thị gợi ý
Khai báo chữ ký với `fnlong<'a>(x: &'a str, y: &'a str) -> &'a str`. Sau đó sử dụng `if x.len() > y.len() { x } else { y }`.
Giải pháp khả dụng sau 3 lần thử
Bài tập 2: Cấu trúc có tham chiếu
Xác định cấu trúc có tên Trích<'a> chứa một trường duy nhất có tên là một phần của loại &'a str. Trong hàm chính, tạo một biến chuỗi có tên là văn bản và khởi tạo một đoạn trích biến thuộc loại Trích đoạn bằng cách mượn một tham chiếu đến văn bản. In đoạn trích.part.
Hiển thị gợi ý
Sử dụng `struct Excerpt<'a> { part: &'a str }`. Trong main khởi tạo nó bằng `Excerpt { part: &text }`.
Giải pháp khả dụng sau 3 lần thử
Bài tập 3: Tài liệu tham khảo tĩnh
Khai báo một biến có tên là message với chú thích kiểu rõ ràng cho thời gian tồn tại tĩnh (&'static str), gán cho nó một chuỗi ký tự. In giá trị của tin nhắn.
Hiển thị gợi ý
Sử dụng cú pháp `let message: &'static str = 'Messaggio statico!';` để chú thích rõ ràng thời gian tồn tại tĩnh.
Giải pháp khả dụng sau 3 lần thử