Gỉ - Loại chung

Generics là một phương tiện để viết mã cho nhiều ngữ cảnh với nhiều kiểu khác nhau. Trong Rust, generics đề cập đến việc tham số hóa các loại dữ liệu và đặc điểm. Generics cho phép viết mã ngắn gọn và rõ ràng hơn bằng cách giảm trùng lặp mã và cung cấp an toàn kiểu. Khái niệm Generics có thể được áp dụng cho các phương pháp, hàm, cấu trúc, liệt kê, tập hợp và đặc điểm.

Các <T> syntaxđược gọi là tham số kiểu, được sử dụng để khai báo một cấu trúc chung. T đại diện cho bất kỳ kiểu dữ liệu nào.

Minh họa: Bộ sưu tập chung

Ví dụ sau khai báo một vectơ chỉ có thể lưu trữ các số nguyên.

fn main(){
   let mut vector_integer: Vec<i32> = vec![20,30];
   vector_integer.push(40);
   println!("{:?}",vector_integer);
}

Đầu ra

[20, 30, 40]

Hãy xem xét đoạn mã sau -

fn main() {
   let mut vector_integer: Vec<i32> = vec![20,30];
   vector_integer.push(40);
   vector_integer.push("hello"); 
   //error[E0308]: mismatched types
   println!("{:?}",vector_integer);
}

Ví dụ trên cho thấy rằng một vector kiểu số nguyên chỉ có thể lưu trữ các giá trị nguyên. Vì vậy, nếu chúng ta cố gắng đẩy một giá trị chuỗi vào bộ sưu tập, trình biên dịch sẽ trả về lỗi. Generics giúp các bộ sưu tập an toàn hơn.

Minh họa: Cấu trúc chung

Tham số type đại diện cho một kiểu mà trình biên dịch sẽ điền vào sau.

struct Data<T> {
   value:T,
}
fn main() {
   //generic type of i32
   let t:Data<i32> = Data{value:350};
   println!("value is :{} ",t.value);
   //generic type of String
   let t2:Data<String> = Data{value:"Tom".to_string()};
   println!("value is :{} ",t2.value);
}

Ví dụ trên khai báo một cấu trúc chung có tên là Dữ liệu . Kiểu <T> chỉ ra một số kiểu dữ liệu. Hàm main () tạo ra hai trường hợp - một trường hợp số nguyên và một trường hợp chuỗi, của cấu trúc.

Đầu ra

value is :350
value is :Tom

Đặc điểm

Các đặc điểm có thể được sử dụng để thực hiện một tập hợp các hành vi (phương pháp) tiêu chuẩn trên nhiều cấu trúc. Đặc điểm giống nhưinterfacestrong Lập trình hướng đối tượng. Cú pháp của đặc điểm như hình dưới đây -

Khai báo một đặc điểm

trait some_trait {
   //abstract or method which is empty
   fn method1(&self);
   // this is already implemented , this is free
   fn method2(&self){
      //some contents of method2
   }
}

Đặc điểm có thể chứa các phương thức cụ thể (phương thức có phần thân) hoặc phương thức trừu tượng (phương thức không có phần thân). Sử dụng một phương pháp cụ thể nếu định nghĩa phương pháp sẽ được chia sẻ bởi tất cả các cấu trúc triển khai Đặc điểm. Tuy nhiên, một cấu trúc có thể chọn ghi đè một chức năng được xác định bởi đặc điểm.

Sử dụng các phương thức trừu tượng nếu định nghĩa phương thức khác nhau đối với các cấu trúc triển khai.

Cú pháp - Triển khai một đặc điểm

impl some_trait for structure_name {
   // implement method1() there..
   fn method1(&self ){
   }
}

Các ví dụ sau định nghĩa một đặc điểm có thể in với một phương pháp in () , được thực hiện bởi các cấu trúc cuốn sách .

fn main(){
   //create an instance of the structure
   let b1 = Book {
      id:1001,
      name:"Rust in Action"
   };
   b1.print();
}
//declare a structure
struct Book {
   name:&'static str,
   id:u32
}
//declare a trait
trait Printable {
   fn print(&self);
}
//implement the trait
impl Printable for Book {
   fn print(&self){
      println!("Printing book with id:{} and name {}",self.id,self.name)
   }
}

Đầu ra

Printing book with id:1001 and name Rust in Action

Các chức năng chung

Ví dụ định nghĩa một hàm chung hiển thị một tham số được truyền cho nó. Tham số có thể là bất kỳ loại nào. Kiểu của tham số phải triển khai đặc điểm Hiển thị để giá trị của nó có thể được in bởi println! vĩ mô.

use std::fmt::Display;

fn main(){
   print_pro(10 as u8);
   print_pro(20 as u16);
   print_pro("Hello TutorialsPoint");
}

fn print_pro<T:Display>(t:T){
   println!("Inside print_pro generic function:");
   println!("{}",t);
}

Đầu ra

Inside print_pro generic function:
10
Inside print_pro generic function:
20
Inside print_pro generic function:
Hello TutorialsPoint