🌐 Detecting your location…
📢 Advertisement — Configure AdSense in Appearance → Customize → AdSense Settings

Rust-Programmierhandbuch für Anfänger 2026: Eigentum, Strukturen und Ladung

⏱️6 min read  ·  1,173 words

Rust ist die am schnellsten wachsende Systemprogrammiersprache im Jahr 2026. Rust wird im Linux-Kernel, Android, Windows, AWS und Meta verwendet und liefert C-Level-Leistung mit garantierter Speichersicherheit zur Kompilierungszeit. Dieser Einsteigerleitfaden behandelt die Kernkonzepte von Rust ohne Fachjargon.

Warum Rust im Jahr 2026?

  • Speichersicherheit– keine Nullzeiger, keine Pufferüberläufe, kein Use-After-Free
  • Leistung– entspricht C/C++ ohne Laufzeitaufwand
  • Furchtlose Parallelität– Datenrennen, die zur Kompilierungszeit abgefangen werden
  • Moderne Werkzeuge— Frachtpaketmanager, Rustfmt, Clippy, Rostanalysator
  • WebAssembly– Führen Sie Rust im Browser mit nahezu nativer Geschwindigkeit aus
  • Ich habe es 9 Jahre lang geliebt– beliebteste Sprache in der Stack Overflow-Umfrage

Installation

# Install rustup (manages Rust versions)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/env

# Verify
rustc --version    # rustc 1.79.0
cargo --version    # cargo 1.79.0

# Create new project
cargo new hello_rust
cd hello_rust

# Run
cargo run

# Build release (optimized)
cargo build --release

Variablen, Typen und Funktionen

// Variables are immutable by default
fn main() {
    let x = 5;          // immutable
    let mut y = 10;     // mutable
    y += 1;             // OK
    // x += 1;          // ERROR: cannot assign to immutable variable

    // Type annotation (usually inferred)
    let name: String = String::from("Alice");
    let age: u32 = 30;
    let pi: f64 = 3.14159;
    let active: bool = true;

    // Constants
    const MAX_SIZE: usize = 1024;

    // Shadowing — create new variable with same name
    let spaces = "   ";
    let spaces = spaces.len(); // now a number, not a string

    println!("Name: {name}, Age: {age}");
}

// Functions
fn add(a: i32, b: i32) -> i32 {
    a + b  // no semicolon = expression, this is the return value
}

fn greet(name: &str) -> String {
    format!("Hello, {}!", name)
}

// Multiple return values via tuple
fn min_max(numbers: &[i32]) -> (i32, i32) {
    let min = *numbers.iter().min().unwrap();
    let max = *numbers.iter().max().unwrap();
    (min, max)
}

let (lo, hi) = min_max(&[3, 1, 4, 1, 5, 9]);
println!("min={lo}, max={hi}");

Eigentum – Rusts Kernkonzept

Das Eigentumssystem von Rust ermöglicht Speichersicherheit ohne Garbage Collection:

// Rule 1: Each value has exactly one owner
// Rule 2: When owner goes out of scope, value is dropped (freed)
// Rule 3: Ownership can be transferred (moved)

fn main() {
    let s1 = String::from("hello");
    let s2 = s1;  // s1 is MOVED to s2
    // println!("{s1}"); // ERROR: s1 is no longer valid

    // Clone to make a copy
    let s3 = String::from("hello");
    let s4 = s3.clone();  // deep copy, both valid
    println!("{s3} {s4}");

    // Stack types (Copy trait): no move needed
    let n1 = 5;
    let n2 = n1;  // copied, n1 still valid
    println!("{n1} {n2}");
}

// Passing to functions transfers ownership
fn takes_ownership(s: String) {
    println!("{s}");
} // s is dropped here

fn gives_ownership() -> String {
    String::from("new string")  // moved to caller
}

fn main() {
    let s = String::from("hello");
    takes_ownership(s);
    // s no longer valid here!

    let s2 = gives_ownership();  // s2 owns the new string
}

Referenzen und Ausleihe

// Borrow without taking ownership using &
fn calculate_length(s: &String) -> usize {
    s.len()
}  // s goes out of scope, but doesn't drop the String (it's borrowed)

fn main() {
    let s1 = String::from("hello");
    let len = calculate_length(&s1);  // pass reference
    println!("{s1} has {len} characters");  // s1 still valid!

    // Mutable references
    let mut s = String::from("hello");
    change(&mut s);  // pass mutable reference
    println!("{s}");  // "hello, world"
}

fn change(s: &mut String) {
    s.push_str(", world");
}

// Rules:
// 1. Any number of immutable references
// 2. OR exactly one mutable reference
// 3. Never both at the same time
// This prevents data races at compile time!

Strukturen und Methoden

#[derive(Debug, Clone)]  // auto-implement Debug and Clone
struct Rectangle {
    width: f64,
    height: f64,
}

impl Rectangle {
    // Associated function (like static method)
    fn new(width: f64, height: f64) -> Self {
        Rectangle { width, height }
    }

    fn square(size: f64) -> Self {
        Rectangle { width: size, height: size }
    }

    // Method — takes &self (immutable borrow)
    fn area(&self) -> f64 {
        self.width * self.height
    }

    fn perimeter(&self) -> f64 {
        2.0 * (self.width + self.height)
    }

    fn can_hold(&self, other: &Rectangle) -> bool {
        self.width > other.width && self.height > other.height
    }

    // Mutable method
    fn scale(&mut self, factor: f64) {
        self.width *= factor;
        self.height *= factor;
    }
}

fn main() {
    let mut rect = Rectangle::new(30.0, 50.0);
    println!("{rect:?}");  // Debug output: Rectangle { width: 30.0, height: 50.0 }
    println!("Area: {}", rect.area());
    rect.scale(2.0);
    println!("After scaling: {}x{}", rect.width, rect.height);
}

Aufzählungen und Mustervergleich

// Enum with data
#[derive(Debug)]
enum Shape {
    Circle(f64),                      // radius
    Rectangle(f64, f64),              // width, height
    Triangle { base: f64, height: f64 },  // named fields
}

impl Shape {
    fn area(&self) -> f64 {
        match self {
            Shape::Circle(r) => std::f64::consts::PI * r * r,
            Shape::Rectangle(w, h) => w * h,
            Shape::Triangle { base, height } => 0.5 * base * height,
        }
    }
}

// Option<T> — replace null
fn find_user(id: u32) -> Option<String> {
    if id == 1 { Some(String::from("Alice")) } else { None }
}

fn main() {
    match find_user(1) {
        Some(name) => println!("Found: {name}"),
        None => println!("Not found"),
    }

    // if let — match one arm
    if let Some(name) = find_user(1) {
        println!("User: {name}");
    }

    // unwrap_or, map, and_then
    let name = find_user(2).unwrap_or(String::from("Guest"));
    let length = find_user(1).map(|n| n.len()).unwrap_or(0);
}

// Result<T, E> — error handling
fn parse_number(s: &str) -> Result<i32, std::num::ParseIntError> {
    s.trim().parse()
}

fn main() {
    match parse_number("42") {
        Ok(n) => println!("Parsed: {n}"),
        Err(e) => println!("Error: {e}"),
    }

    // ? operator — propagate errors
    fn add_strings(a: &str, b: &str) -> Result<i32, std::num::ParseIntError> {
        let x: i32 = a.trim().parse()?;  // return Err if fails
        let y: i32 = b.trim().parse()?;
        Ok(x + y)
    }
}

Sammlungen

use std::collections::HashMap;

fn main() {
    // Vec — dynamic array
    let mut v: Vec<i32> = Vec::new();
    v.push(1);
    v.push(2);
    v.push(3);

    // Iterate
    for n in &v { print!("{n} "); }

    // Useful methods
    v.retain(|x| *x > 1);  // remove elements
    let sum: i32 = v.iter().sum();
    let doubled: Vec<i32> = v.iter().map(|x| x * 2).collect();

    // HashMap
    let mut scores: HashMap<String, u32> = HashMap::new();
    scores.insert(String::from("Alice"), 95);
    scores.insert(String::from("Bob"), 87);

    // Only insert if not present
    scores.entry(String::from("Alice")).or_insert(100);

    // Lookup
    if let Some(score) = scores.get("Alice") {
        println!("Alice: {score}");
    }

    // Iterate
    for (name, score) in &scores {
        println!("{name}: {score}");
    }
}

Fracht: Paketmanager

# Cargo.toml
[package]
name = "my_app"
version = "0.1.0"
edition = "2021"

[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
tokio = { version = "1", features = ["full"] }
reqwest = { version = "0.12", features = ["json"] }
anyhow = "1.0"
clap = { version = "4.0", features = ["derive"] }

cargo add serde --features derive    # add dependency
cargo update                         # update dependencies
cargo test                           # run tests
cargo bench                          # run benchmarks
cargo doc --open                     # generate and open docs
cargo clippy                         # linting
cargo fmt                            # auto-format

Roadmap für die ersten Schritte

  1. Lesen Sie die ersten 8 Kapitel vonDas Rostbuch(kostenlos unter doc.rust-lang.org)
  2. VollständigRascheln— interaktive Übungen
  3. Erstellen Sie ein CLI-Tool mitklatschen
  4. Schreiben Sie eine REST-API mitaxum
  5. Tragen Sie zu einem Open-Source-Rust-Projekt bei

Rusts Lernkurve ist real, aber die Auszahlung ist dauerhaft. Sobald Sie Eigentum und Ausleihen verinnerlicht haben, werden Sie sichereren und schnelleren Code in jeder Sprache schreiben. Das Rust-Ökosystem im Jahr 2026 ist ausgereift genug für Webserver, CLIs, Embedded und WebAssembly.

✍️ Leave a Comment

Your email address will not be published. Required fields are marked *

🌐 Read in:🇬🇧 English🇩🇪 Deutsch🇧🇷 Português🇸🇦 العربية🇮🇳 हिन्दी🇧🇩 বাংলা