Hiểu các loại chung của Rust
Luôn có những mức độ không chắc chắn trong khi phát triển ứng dụng, điều này có thể dẫn đến lỗi, đặc biệt nếu các chức năng của bạn chấp nhận các loại đối số cụ thể. Để giảm lỗi do không chắc chắn, bạn có thể sử dụng Generics. Generics cung cấp chức năng để tạo các lớp, hàm và cấu trúc dữ liệu để làm việc với các loại khác nhau.
Sử dụng thuốc generic, bạn có thể tạo và xác định các thuật toán cũng như cấu trúc dữ liệu có thể hoạt động trên nhiều loại mà không cần viết mã phức tạp và triển khai riêng cho từng loại. Generics cải thiện khả năng sử dụng lại mã và hiệu quả trong khi duy trì hiệu suất và an toàn của loại.
Mục Lục
Sử dụng các loại chung trong Rust
Loại chung của Rust có thể tương tác với các loại dữ liệu Rust khác. Bạn sẽ xác định các loại chung bằng dấu ngoặc nhọn (<>), theo sau là hai tham số trở lên.
Đây là một định nghĩa cấu trúc chung có hai tham số kiểu chung:
struct Point<T, U> {
x: T,
y: U,
}
bên trong Điểm cấu trúc, T, Và bạn là các tham số loại chung.
Bạn có thể thay thế các tham số loại chung bằng bất kỳ loại dữ liệu nào khi khởi tạo:
fn main() {
let my_point = Point { x: String::from("hello"), y: String::from("world") }; println!(
"The x value of my_point is {} and the y value is {}.",
my_point.x,
my_point.y
);
}
Các quan điểm của tôi biến là một thể hiện của Điểm cấu trúc được khởi tạo với các loại chuỗi. Trình biên dịch Rust suy ra các kiểu cụ thể của t Và bạn dựa trên các giá trị trên khởi tạo.
Giới hạn đặc điểm cho các loại chung
Các loại chung của Rust có thể sử dụng các giới hạn đặc điểm để đảm bảo an toàn cho loại. Các đặc điểm là tập hợp các phương thức mà các loại có thể thực hiện để thể hiện các hành vi nhất định được xác định cho đặc điểm đó.
Giới hạn đặc điểm xác định rằng một loại chung phải thực hiện một hoặc nhiều đặc điểm.
Đây là một ví dụ về một hàm chung trả về giá trị lớn hơn trong hai giá trị với một ràng buộc đặc điểm để đảm bảo rằng các loại được so sánh thực hiện đặc điểm đó:
trait Maximum {
fn max(self, other: Self) -> Self;
}
impl<T: PartialOrd> Maximum for T {
fn max(self, other: Self) -> Self {
if self > other {
self
} else {
other
}
}
}
fn main() {
let a = 5;
let b = 10;
let largest = Maximum::max(a, b);
println!("The largest value is {}", largest);
}
Các tối đa đặc điểm có một tối đa phương thức trả về giá trị lớn hơn trong hai giá trị cùng loại. Bất kỳ loại nào thực hiện Thứ tự một phần đặc điểm thực hiện các tối đa đặc điểm.
Các tối đa phương thức lấy hai giá trị của Bản thân loại — đề cập đến loại thực hiện tối đa trait—và so sánh các giá trị.
Các chủ yếu hàm so sánh hai biến bằng cách sử dụng tối đa phương pháp và in lớn nhất.
Các ràng buộc cho các loại chung
Các ràng buộc tương tự như các giới hạn đặc điểm, nhưng chúng cho phép bạn chỉ định các yêu cầu bổ sung đối với các loại bạn đang sử dụng làm tham số loại.
Nếu bạn muốn tạo một hàm chung chấp nhận các loại để chuyển đổi chuỗi, bạn có thể sử dụng một ràng buộc để đảm bảo rằng tham số loại thực hiện một đặc điểm.
trait ToString {
fn to_string(&self) -> String;
}
fn to_string<T: ToString>(value: T) -> String {
value.to_string()
}
Các to_string tham số giá trị phải thực hiện các ToString đặc điểm, đảm bảo rằng bạn có thể chuyển đổi các giá trị của loại t xâu chuỗi với to_string phương pháp.
Các loại chung rất hữu ích để làm việc với các đặc điểm
Các loại chung của Rust rất mạnh và có những lĩnh vực cần cải thiện. Một lĩnh vực trọng tâm quan trọng là cải thiện hiệu suất của mã chung. Hiện tại, hệ thống loại của Rust có thể áp đặt chi phí chung cho mã chung, làm chậm hiệu suất.
Các loại chung có lợi khi làm việc với các đặc điểm. Sử dụng các kiểu chung, bạn có thể tạo các đối tượng đặc điểm hoạt động với bất kỳ kiểu nào triển khai một đặc điểm để làm cho các phương thức của bạn linh hoạt hơn.