R
Structs & Enums
Rust Syntax Guide
Définir des types de données personnalisés avec structs et enums
Structs & Enums
Définir des types de données personnalisés avec structs et enums
Rust structs & enums (rust)
#[derive(Debug)] // Enable debug printing
struct User {
username: String,
email: String,
sign_in_count: u64,
active: bool,
}
#[derive(Debug)]
struct Rectangle {
width: u32,
height: u32,
}
// Implementation block
impl Rectangle {
// Associated function (like static method)
fn square(size: u32) -> Rectangle {
Rectangle {
width: size,
height: size,
}
}
// Method
fn area(&self) -> u32 {
self.width * self.height
}
// Method that takes mutable reference
fn set_width(&mut self, width: u32) {
self.width = width;
}
// Method that takes ownership
fn can_hold(&self, other: &Rectangle) -> bool {
self.width > other.width && self.height > other.height
}
}
// Enums
#[derive(Debug)]
enum IpAddr {
V4(String),
V6(String),
}
#[derive(Debug)]
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
// Enum with methods
impl Message {
fn call(&self) {
match self {
Message::Quit => println!("Quit"),
Message::Move { x, y } => println!("Move to {}, {}", x, y),
Message::Write(text) => println!("Write: {}", text),
Message::ChangeColor(r, g, b) => println!("Color: {},{},{}", r, g, b),
}
}
}
// Option enum (built-in)
fn find_user(id: u32) -> Option<User> {
if id == 1 {
Some(User {
username: String::from("alice"),
email: String::from("alice@example.com"),
sign_in_count: 1,
active: true,
})
} else {
None
}
}
// Result enum (built-in)
fn divide(a: f64, b: f64) -> Result<f64, String> {
if b == 0.0 {
Err(String::from("Division by zero"))
} else {
Ok(a / b)
}
}
fn main() {
// Struct usage
let mut user1 = User {
email: String::from("someone@example.com"),
username: String::from("someusername123"),
active: true,
sign_in_count: 1,
};
user1.email = String::from("anotheremail@example.com");
// Rectangle usage
let rect1 = Rectangle {
width: 30,
height: 50,
};
let rect2 = Rectangle::square(20); // Associated function
let rect3 = Rectangle {
width: 10,
height: 40,
};
println!("Area: {}", rect1.area());
println!("Can rect1 hold rect3? {}", rect1.can_hold(&rect3));
println!("Can rect2 hold rect3? {}", rect2.can_hold(&rect3));
// Enum usage
let home = IpAddr::V4(String::from("127.0.0.1"));
let loopback = IpAddr::V6(String::from("::1"));
let msg1 = Message::Move { x: 10, y: 20 };
let msg2 = Message::Write(String::from("hello"));
let msg3 = Message::Quit;
msg1.call();
msg2.call();
msg3.call();
// Option usage
match find_user(1) {
Some(user) => println!("Found user: {}", user.username),
None => println!("User not found"),
}
// Result usage
match divide(10.0, 2.0) {
Ok(result) => println!("Result: {}", result),
Err(error) => println!("Error: {}", error),
}
}
Explanation
Les structs vous permettent de créer des types de données personnalisés qui regroupent des valeurs liées. Les enums (énumérations) définissent un type en énumérant ses variantes possibles, qui peuvent également contenir des données.
Common Use Cases
- Modéliser des structures de données complexes
- Représenter différents états ou types de données
- Créer des types spécifiques au domaine
Related Rust Syntax
Master Structs & Enums in Rust
Understanding Structs & Enums is fundamental to writing clean and efficient Rust code. This comprehensive guide provides you with practical examples and detailed explanations to help you master this important concept.
Whether you're a beginner learning the basics or an experienced developer looking to refresh your knowledge, our examples cover real-world scenarios and best practices for using Structs & Enums effectively in your Rust projects.
Key Takeaways
- Modéliser des structures de données complexes
- Représenter différents états ou types de données
- Créer des types spécifiques au domaine