Enum
Enum ในภาษา Rust เป็นการกำหนดประเภทข้อมูลที่สามารถมีหลายรูปแบบ แต่ละรูปแบบของ enum
สามารถเก็บข้อมูลได้แตกต่างกัน
ตัวอย่างการใช้งาน Enum
enum DataType { Type1, Type2 { x: i32, y: i32 }, Type3(String), Type4(u8, u8, u8), } fn main() { let data1 = DataType::Type1; let data2 = DataType::Type2 { x: 0, y: -4 }; let data3 = DataType::Type3("hello world".to_string()); let data4 = DataType::Type4(42, 123, 255); }
note
เทียบได้กับ Typescript
type DataType =
| { type: "type1" }
| { type: "type2", x: number, y: number }
| { type: "type3", text: string }
| { type: "type4", r: number, g: number, b: number }
const data1 = { type: "type1" }
const data2 = { type: "type2", x: 0, y: -4 }
const data3 = { type: "type3", text: "hello world" }
const data4 = { type: "type4", r: 42, g: 123, b: 255 }
การ Implement ฟังก์ชันให้ Enum
ในภาษา Rust เราสามารถ implement ฟังก์ชันให้กับ enum
ได้เช่นเดียวกับ struct
ตัวอย่างการ Implement ฟังก์ชันให้ Enum
enum DataType { Type1, Type2, } impl DataType { fn something() { println!("do something") } } fn main() { let data = DataType::Type1; data.something(); }
Option
ในภาษา Rust ไม่มีสิ่งที่เรียกว่า null
เหมือนภาษาอื่นๆ แต่จะใช้ enum ที่ชื่อ Option<T>
ในการจัดการค่าที่เป็น Optional
note
Option<T>
คือ enum
ที่สามารถเป็นได้ 2 อย่างคือ Some(T)
หรือ None
enum Option<T> {
Some(T),
None,
}
ตัวอย่างการใช้งาน Option<T>
struct Something { nickname: Option<String>, name: String, } fn main() { let s1 = Something { nickname: Option::Some("H".to_string()), name: "Hello".to_string(), }; let s2 = Something { nickname: Option::None, name: "Something".to_string(), }; }
ลองแก้โค้ดดู
- หากลบ
Option::
ออกจากโค้ด จะสามารถคอมไพล์ได้หรือไม่?
Result
ในภาษา Rust ไม่มีสิ่งที่เรียกว่า try-catch เหมือนภาษาอื่นๆ แต่จะใช้ enum
ที่ชื่อ Result<T, E>
ในการจัดการกับสถานการณ์ที่อาจล้มเหลว
note
Result<T, E>
คือ enum
ที่สามารถมีค่าได้ 2 อย่างคือ Ok(T)
หรือ Err(E)
enum Result<T, E> {
Ok(T),
Err(E),
}
ตัวอย่างฟังก์ชันที่มีการคืนค่า Result<T, E>
use std::fs::File;
use std::io::Error;
fn open_file(filename: &str) -> Result<File, Error> {
File::open(filename)
}
fn main() {
match open_file("myfile.txt") {
Ok(file) => println!("success: {:?}", file),
Err(e) => println!("error: {}", e),
}
}