Quyền sở hữu trong Rust là gì?
Các ngôn ngữ lập trình khác nhau về cách chúng xử lý bộ nhớ và thực thi các quy tắc quản lý bộ nhớ. Go và Python sử dụng trình thu gom rác, vì vậy các nhà phát triển có thể tập trung vào việc viết mã. C và C ++ trao cho các lập trình viên trách nhiệm quản lý bộ nhớ ở cấp độ thấp hơn.
Rust xử lý việc quản lý bộ nhớ theo cách khác, sử dụng các khái niệm mà nó gọi là quyền sở hữu và vay mượn. Nó sử dụng một “bộ kiểm tra mượn” để thực thi an toàn bộ nhớ một cách hiệu quả.
Mục Lục
Quyền sở hữu là gì?
Quyền sở hữu là một tính năng và quy ước của Rust giúp đảm bảo an toàn bộ nhớ của các chương trình không có bộ thu gom rác. Đó là một cách khác để giải quyết vấn đề rò rỉ bộ nhớ trong mã của bạn.
Trình biên dịch Rust kiểm tra xem một chương trình có tuân theo các quy tắc sở hữu tại thời điểm biên dịch hay không. Nếu chương trình tuân theo các quy tắc này, nó có thể chạy. Nếu không, trình biên dịch sẽ từ chối tạo tệp thực thi.
Rust xác minh các quy tắc sở hữu bằng cách sử dụng người kiểm tra mượn. Trình kiểm tra mượn xác minh mô hình sở hữu và quyết định xem một giá trị trong bộ nhớ (ngăn xếp hoặc đống) có nằm ngoài phạm vi hay không. Nếu một giá trị nằm ngoài phạm vi của nó, nó sẽ không thể truy cập được vào các phần khác của chương trình trừ khi nó được mượn.
Quy tắc sở hữu
Trong Rust, mọi biến đều sở hữu giá trị mà nó được khởi tạo và chỉ có thể có một chủ sở hữu. Khi chủ sở hữu nằm ngoài phạm vi, giá trị sẽ bị giảm. Điều quan trọng là phải hiểu chi tiết về các quy tắc sở hữu.
Quy tắc sở hữu đầu tiên là mọi biến đều sở hữu giá trị được khởi tạo của nó.
let owner = String::from("one");
Các chủ nhân biến trên sở hữu chuỗi một và, không giống như các ngôn ngữ như Python và Go, giá trị đó sẽ bị xóa khi gán lại biến.
Quy tắc sở hữu thứ hai là hai biến không thể trỏ đến cùng một vị trí bộ nhớ; mọi giá trị chỉ có thể có một chủ sở hữu.
let new_owner = owner;
Các new_owner bây giờ biến sở hữu giá trị được lưu trữ tại vị trí bộ nhớ của chủ nhân Biến đổi. Nếu bạn cố gắng sử dụng chủ nhân biến, trình biên dịch sẽ hoảng loạn và nó sẽ từ chối tạo tệp thực thi.
Trong hầu hết các ngôn ngữ sử dụng bộ thu gom rác, hai biến có thể trỏ đến cùng một vị trí bộ nhớ. Đây là một ví dụ về mã JavaScript tương đương:
let owner = "owner";
let new_owner = owner;
console.log(new_owner);
Chạy mã JavaScript ở trên hoạt động không có lỗi và nếu bạn làm như vậy trong Go hoặc Python, chương trình của bạn cũng sẽ hoạt động mà không có lỗi.
Quy tắc sở hữu thứ ba là khi một biến nằm ngoài phạm vi được khai báo, giá trị sẽ bị giảm và bộ nhớ được phân bổ.
{
let example = String::from("Here's a new scope");
}print!("{}", example)
Bạn không thể truy cập vào thí dụ biến bên ngoài phạm vi của nó; cố gắng làm như vậy sẽ khiến trình biên dịch hoảng loạn.
Quyền sở hữu trong các chức năng
Khi bạn truyền một giá trị cho một hàm dưới dạng đối số, hàm có thể truy cập vào biến đó ngay cả khi nó không được khai báo trong phạm vi của nó:
fn printer(value: String) -> String {
return value
}fn main() {
let x = String::from("Prints a value");
print!("{} The Result of Printing X is that it -:", printer(x));
}
Hàm có thể truy cập biến đó vì Rust chuyển quyền sở hữu của nó sang hàm tại thời điểm biên dịch.
Bạn có thể nghĩ rằng sau này vẫn có thể sử dụng biến trong phạm vi ban đầu của nó:
fn printer(value: String) -> String {
return value
}fn main() {
let x = String::from("Prints a value");
print!("{} The Result of Printing x is that it -:", printer(x));
println!("{} shouldn't be accessible", x)
}
Nhưng nếu bạn thử điều này, trình biên dịch sẽ hoảng sợ và từ chối tạo tệp thực thi:
Rust ưu tiên khả năng tái sử dụng của mã
Khả năng tái sử dụng mã là một thực hành cần thiết, nhưng để thực hành khả năng tái sử dụng mã, bạn cần hiểu các quy tắc sở hữu của Rust.
Rust là một ngôn ngữ lập trình rất linh hoạt. Nó cung cấp các khái niệm như mượn, di chuyển, sao chép và nhân bản quyền sở hữu để có thể tái sử dụng thay đổi.