R

Structs & Enums

Rust Syntax Guide

Definieren benutzerdefinierter Datentypen mit Structs und Enums

Structs & Enums

Definieren benutzerdefinierter Datentypen mit Structs und 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

Structs ermöglichen es Ihnen, benutzerdefinierte Datentypen zu erstellen, die zusammenhängende Werte gruppieren. Enums (Aufzählungen) definieren einen Typ, indem sie seine möglichen Varianten aufzählen, die auch Daten enthalten können.

Common Use Cases

  • Modellieren komplexer Datenstrukturen
  • Darstellen verschiedener Zustände oder Datentypen
  • Erstellen domänenspezifischer Typen

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

  • Modellieren komplexer Datenstrukturen
  • Darstellen verschiedener Zustände oder Datentypen
  • Erstellen domänenspezifischer Typen