Rust - Enums
Trong lập trình Rust, khi chúng ta phải chọn một giá trị từ danh sách các biến thể có thể có, chúng ta sử dụng kiểu dữ liệu liệt kê. Một kiểu liệt kê được khai báo bằng từ khóa enum . Sau đây là cú pháp của enum:
enum enum_name {
variant1,
variant2,
variant3
}
Minh họa: Sử dụng phép liệt kê
Ví dụ khai báo một enum - GenderCategory , có các biến thể là Nam và Nữ. Bản in! macro hiển thị giá trị của enum. Trình biên dịch sẽ báo lỗi rằng đặc điểm std :: fmt :: Debug không được triển khai cho GenderCategory . Thuộc tính # [dẫn xuất (Gỡ lỗi)] được sử dụng để loại bỏ lỗi này.
// The `derive` attribute automatically creates the implementation
// required to make this `enum` printable with `fmt::Debug`.
#[derive(Debug)]
enum GenderCategory {
Male,Female
}
fn main() {
let male = GenderCategory::Male;
let female = GenderCategory::Female;
println!("{:?}",male);
println!("{:?}",female);
}
Đầu ra
Male
Female
Struct và Enum
Ví dụ sau đây định nghĩa một cấu trúc Person. Trường giới tính thuộc loại GenderCategory (là một enum) và có thể được chỉ định Nam hoặc Nữ làm giá trị.
// The `derive` attribute automatically creates the
implementation
// required to make this `enum` printable with
`fmt::Debug`.
#[derive(Debug)]
enum GenderCategory {
Male,Female
}
// The `derive` attribute automatically creates the implementation
// required to make this `struct` printable with `fmt::Debug`.
#[derive(Debug)]
struct Person {
name:String,
gender:GenderCategory
}
fn main() {
let p1 = Person {
name:String::from("Mohtashim"),
gender:GenderCategory::Male
};
let p2 = Person {
name:String::from("Amy"),
gender:GenderCategory::Female
};
println!("{:?}",p1);
println!("{:?}",p2);
}
Ví dụ này tạo các đối tượng p1 và p2 kiểu Person và khởi tạo các thuộc tính, tên và giới tính cho từng đối tượng này.
Đầu ra
Person { name: "Mohtashim", gender: Male }
Person { name: "Amy", gender: Female }
Tùy chọn Enum
Option là một enum được xác định trước trong thư viện tiêu chuẩn Rust. Enum này có hai giá trị - Some (dữ liệu) và None.
Cú pháp
enum Option<T> {
Some(T), //used to return a value
None // used to return null, as Rust doesn't support
the null keyword
}
Ở đây, kiểu T đại diện cho giá trị của bất kỳ kiểu nào.
Rust không hỗ trợ từ khóa null . Giá trị None , trong enumOption , có thể được sử dụng bởi một hàm để trả về giá trị null. Nếu có dữ liệu để trả về, hàm có thể trả về Một số (dữ liệu) .
Hãy để chúng tôi hiểu điều này với một ví dụ -
Chương trình định nghĩa một hàm is_even () , với kiểu trả về là Option. Hàm xác minh xem giá trị được truyền là số chẵn hay không. Nếu đầu vào là chẵn thì trả về giá trị true, còn lại thì hàm trả về Không có .
fn main() {
let result = is_even(3);
println!("{:?}",result);
println!("{:?}",is_even(30));
}
fn is_even(no:i32)->Option<bool> {
if no%2 == 0 {
Some(true)
} else {
None
}
}
Đầu ra
None
Some(true)
Câu lệnh đối sánh và Enum
Câu lệnh so khớp có thể được sử dụng để so sánh các giá trị được lưu trữ trong một enum. Ví dụ sau định nghĩa một hàm, print_size , lấy CarType enum làm tham số. Hàm so sánh các giá trị tham số với một tập hợp hằng số được xác định trước và hiển thị thông báo thích hợp.
enum CarType {
Hatch,
Sedan,
SUV
}
fn print_size(car:CarType) {
match car {
CarType::Hatch => {
println!("Small sized car");
},
CarType::Sedan => {
println!("medium sized car");
},
CarType::SUV =>{
println!("Large sized Sports Utility car");
}
}
}
fn main(){
print_size(CarType::SUV);
print_size(CarType::Hatch);
print_size(CarType::Sedan);
}
Đầu ra
Large sized Sports Utility car
Small sized car
medium sized car
Phù hợp với tùy chọn
Ví dụ về hàm is_even , trả về kiểu Option, cũng có thể được triển khai với câu lệnh so khớp như hình dưới đây:
fn main() {
match is_even(5) {
Some(data) => {
if data==true {
println!("Even no");
}
},
None => {
println!("not even");
}
}
}
fn is_even(no:i32)->Option<bool> {
if no%2 == 0 {
Some(true)
} else {
None
}
}
Đầu ra
not even
Đối sánh & Enum với Loại dữ liệu
Có thể thêm kiểu dữ liệu vào từng biến thể của enum. Trong ví dụ sau, các biến thể Tên và Usr_ID của enum tương ứng là kiểu Chuỗi và kiểu số nguyên. Ví dụ sau cho thấy việc sử dụng câu lệnh so khớp với một enum có kiểu dữ liệu.
// The `derive` attribute automatically creates the implementation
// required to make this `enum` printable with `fmt::Debug`.
#[derive(Debug)]
enum GenderCategory {
Name(String),Usr_ID(i32)
}
fn main() {
let p1 = GenderCategory::Name(String::from("Mohtashim"));
let p2 = GenderCategory::Usr_ID(100);
println!("{:?}",p1);
println!("{:?}",p2);
match p1 {
GenderCategory::Name(val)=> {
println!("{}",val);
}
GenderCategory::Usr_ID(val)=> {
println!("{}",val);
}
}
}
Đầu ra
Name("Mohtashim")
Usr_ID(100)
Mohtashim