Enums và Khớp mẫu trong Rust
Rust cung cấp nhiều loại dữ liệu khác nhau để thực hiện các thao tác, từ các loại dữ liệu cơ bản như chuỗi, số nguyên và số dấu phẩy động đến các loại dữ liệu phức hợp như vectơ và mảng đến các loại dữ liệu tổng hợp như cấu trúc và kiểu liệt kê.
Enums (liệt kê) là một kiểu dữ liệu cho phép biểu diễn một tập hợp giá trị cố định, chẳng hạn như ngày trong tuần và màu sắc của cầu vồng. Enums rất hữu ích khi các giá trị có thể có của một biến bị giới hạn và đã biết.
Mục Lục
Xác định Enums trong Rust
Khai báo enums trong Rust tương tự như khai báo enums trong C#. Bạn sẽ sử dụng liệt kê từ khóa theo sau tên và một bộ dấu ngoặc nhọn để xác định kiểu liệt kê. Bạn có thể xác định các biến thể (thực thể) có thể có trong dấu ngoặc nhọn bằng dấu phẩy làm dấu phân cách.
Đây là một enum cho các ngày trong tuần:
enum Weekday {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday,
}
Các ngày thường enum đại diện cho các ngày trong tuần. Các biến thể là tên của ngày và không có giá trị liên quan. Ngoài ra, các biến thể của enum của bạn có thể là bất kỳ loại dữ liệu Rust nào.
Bạn có thể truy cập các biến thể bằng cách chỉ định tên biến thể bằng toán tử dấu tách đường dẫn (::) trên enum.
let day = Weekday::Monday;
let day: Weekday = Weekday::Monday;
Mã xác định rằng bạn muốn truy cập vào Thứ hai biến thể của Weekday enum.
Biến thể và phân biệt đối xử của Enums
Các biến thể của một enum được liên kết với các giá trị số nguyên được gọi là phân biệt đối xử. Theo mặc định, các giá trị phân biệt bắt đầu từ 0 và được tăng thêm 1 cho các biến thể tiếp theo; tuy nhiên, có thể chỉ định các giá trị phân biệt tùy chỉnh cho từng biến thể.
Đây là một ví dụ về enum Ngày trong tuần với các biến thể được gán giá trị.
enum Weekday {
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6,
Sunday = 7,
}
Weekday enum có bảy biến thể đại diện cho mỗi ngày trong tuần và mỗi ngày có một giá trị (được gọi là giá trị phân biệt) được gán cho chúng. Các biến thể theo thứ tự từ ngày đầu tiên đến ngày cuối cùng trong tuần.
Bạn có thể truy cập giá trị phân biệt bằng cách sử dụng tên biến thể.
fn main() {
println!("Monday: {}", Weekday::Monday as i32);
println!("Tuesday: {}", Weekday::Tuesday as i32);
println!("Wednesday: {}", Weekday::Wednesday as i32);
println!("Thursday: {}", Weekday::Thursday as i32);
println!("Friday: {}", Weekday::Friday as i32);
println!("Saturday: {}", Weekday::Saturday as i32);
println!("Sunday: {}", Weekday::Sunday as i32);
}
Các inln! macro được sử dụng để in các phân biệt. Mỗi println! lời gọi macro nhận hai đối số: một chuỗi định dạng và một giá trị. Chuỗi định dạng chỉ định cách định dạng đầu ra; giá trị là giá trị thực được in.
Trong trường hợp này, chuỗi định dạng là một chuỗi ký tự có chứa tên của ngày trong tuần và giá trị là biến thể enum với cách chuyển rõ ràng sang i32 kiểu số nguyên.
Việc truyền rõ ràng tới i32 là cần thiết vì các enum Rust được biểu diễn dưới dạng số nguyên, nhưng loại số nguyên cụ thể phụ thuộc vào kích thước của enum. Theo mặc định, Rust chỉ định loại số nguyên nhỏ nhất có thể đại diện cho tất cả các phân biệt đối xử trong enum. Nhưng trong trường hợp này, bạn muốn in các giá trị dưới dạng số nguyên i32, vì vậy bạn cần truyền chúng một cách rõ ràng.
Đây là kết quả từ việc chạy chủ yếu chức năng:
Kết hợp các mẫu trong Rust
Khớp mẫu là cấu trúc cấu trúc kiểm soát Rust hữu ích để xác định các mẫu dữ liệu. Khớp mẫu cho phép viết mã ngắn gọn và hiệu quả trong khi vận hành với cấu trúc dữ liệu nâng cao hoặc thực hiện các thao tác phức tạp.
Bạn sẽ sử dụng cuộc thi đấu từ khóa theo sau bởi => dấu phân cách cho mẫu và hoạt động cho mẫu tương ứng. Mẫu có thể là bất kỳ biểu thức Rust nào, bao gồm chữ, biến và lệnh gọi hàm.
Đây là một tuyên bố đối sánh mẫu:
fn main(){
let x = 5;
match x {
1 => println!("one"),
2 => println!("two"),
3 => println!("three"),
_ => println!("something else"),
}
}
Các chủ yếu chức năng phù hợp x đối với một số mẫu và sau đó in giá trị dựa trên giá trị của x. Mẫu dấu gạch dưới (_) là một mẫu ký tự đại diện được sử dụng làm điểm bắt tất cả cho các trường hợp không được xử lý rõ ràng.
Enums và Khớp mẫu
Enums và khớp mẫu rất hữu ích để thể hiện và làm việc với các cấu trúc dữ liệu nâng cao theo cách hiệu quả và an toàn về loại. Bạn có thể sử dụng enum để xác định một tập hợp giá trị cố định và khớp mẫu để hoạt động với các giá trị đó.
Đây là một enum cho các màu sắc trong cầu vồng:
enum Rainbow {
Red,
Orange,
Yellow,
Green,
Blue,
Indigo,
Violet,
}
Mỗi biến thể của cầu vồng enum đại diện cho một màu của cầu vồng. Bạn có thể sử dụng khớp mẫu với câu lệnh khớp để khớp các mẫu với biến thể nhằm kiểm soát luồng chương trình dựa trên màu sắc của cầu vồng.
Đây là một chức năng lấy biến thể màu từ Rainbow enum và in một thông báo dựa trên màu sắc.
fn print_color(color: Rainbow) {
match color {
Rainbow::Red => println!("The color is red!"),
Rainbow::Orange => println!("The color is orange!"),
Rainbow::Yellow => println!("The color is yellow!"),
Rainbow::Green => println!("The color is green!"),
Rainbow::Blue => println!("The color is blue!"),
Rainbow::Indigo => println!("The color is indigo!"),
Rainbow::Violet => println!("The color is violet!"),
}
}fn main() {
let color = Rainbow::Blue;
print_color(color);
}
bạn có thể nhận được các biến thể không bao giờ được xây dựng hoặc các cảnh báo tương tự khi bạn cố gắng thực thi đoạn mã trên vì các biến thể khác ngoài biến thể Màu xanh không bao giờ được tạo trong mã này. Vì vậy, trong trường hợp này, bạn có thể bỏ qua những cảnh báo này một cách an toàn vì nó có chủ ý.
Các in_color hàm nhận một tham số màu của loại Rainbow enum. Câu lệnh khớp khớp với màu từ một bộ màu được truy cập thông qua các tên biến thể. Và cuối cùng, tin nhắn được in dựa trên màu phù hợp.
Bạn có thể sử dụng khớp mẫu cho các hoạt động phức tạp như nhiều giá trị trả về dựa trên một điều kiện.
fn calculate_wavelength(color: Rainbow) -> u32 {
match color { Rainbow::Red => 700,
Rainbow::Orange => 590,
Rainbow::Yellow => 570,
Rainbow::Green => 510,
Rainbow::Blue => 475,
Rainbow::Indigo => 445,
Rainbow::Violet => 400,
}
}
Các tính toán bước sóng hàm lấy một biến thể màu của loại Rainbow enum làm tham số và trả về một số nguyên 32 bit không dấu là bước sóng của màu phù hợp với mẫu.
Rust cũng cung cấp các cấu trúc để tạo các loại tùy chỉnh
Enums rất hữu ích để xác định các loại tùy chỉnh cho một số hoạt động, đặc biệt là trong trường hợp các trường đã biết và xác định.
Rust cũng cung cấp các cấu trúc mà bạn có thể sử dụng để tạo các loại tùy chỉnh với các trường được đặt tên. Không giống như enums, cấu trúc cho phép bạn xác định các trường thuộc các loại khác nhau mà bạn có thể truy cập và sửa đổi riêng lẻ.