Arrays und Slices

RustRustBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden wir Arrays und Slices in Rust erkunden. Ein Array ist eine Sammlung von Objekten vom gleichen Typ, die in zusammenhängender Speicherstelle gespeichert sind, und seine Länge ist zur Compile-Zeit bekannt. Ein Slice hingegen ähnelt sich einem Array,但其 Länge ist zur Compile-Zeit nicht bekannt. Slices können verwendet werden, um einen Abschnitt eines Arrays zu entleihen. Wir werden auch behandeln, wie Arrays erstellt werden, Elemente abgerufen werden, die Länge berechnet wird, Speicher zugewiesen wird, Arrays als Slices entliehen werden und mit leeren Slices gearbeitet wird. Darüber hinaus werden wir diskutieren, wie man sicher Elemente eines Arrays mit der .get()-Methode zugreift und außereinander liegende Fehler behandelt.

Hinweis: Wenn das Lab keinen Dateinamen angibt, können Sie einen beliebigen Dateinamen verwenden. Beispielsweise können Sie main.rs verwenden und es mit rustc main.rs &&./main kompilieren und ausführen.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/AdvancedTopicsGroup(["Advanced Topics"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/ControlStructuresGroup(["Control Structures"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/DataTypesGroup -.-> rust/integer_types("Integer Types") rust/DataTypesGroup -.-> rust/string_type("String Type") rust/DataTypesGroup -.-> rust/type_casting("Type Conversion and Casting") rust/ControlStructuresGroup -.-> rust/for_loop("for Loop") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") rust/AdvancedTopicsGroup -.-> rust/operator_overloading("Traits for Operator Overloading") subgraph Lab Skills rust/variable_declarations -.-> lab-99204{{"Arrays und Slices"}} rust/integer_types -.-> lab-99204{{"Arrays und Slices"}} rust/string_type -.-> lab-99204{{"Arrays und Slices"}} rust/type_casting -.-> lab-99204{{"Arrays und Slices"}} rust/for_loop -.-> lab-99204{{"Arrays und Slices"}} rust/function_syntax -.-> lab-99204{{"Arrays und Slices"}} rust/expressions_statements -.-> lab-99204{{"Arrays und Slices"}} rust/method_syntax -.-> lab-99204{{"Arrays und Slices"}} rust/operator_overloading -.-> lab-99204{{"Arrays und Slices"}} end

Arrays und Slices

Ein Array ist eine Sammlung von Objekten vom gleichen Typ T, die in zusammenhängender Speicherstelle gespeichert sind. Arrays werden mit eckigen Klammern [] erstellt, und ihre Länge, die zur Compile-Zeit bekannt ist, ist Teil ihrer Typsignatur [T; length].

Slices ähneln sich Arrays, aber ihre Länge ist zur Compile-Zeit nicht bekannt. Stattdessen ist ein Slice ein zweigeteiltes Objekt; das erste Wort ist ein Zeiger auf die Daten, das zweite Wort die Länge des Slices. Die Wortgröße ist die gleiche wie usize, bestimmt durch die Prozessorarchitektur, z.B. 64 Bit auf einem x86-64. Slices können verwendet werden, um einen Abschnitt eines Arrays zu entleihen und haben die Typsignatur &[T].

use std::mem;

// Diese Funktion entleiht einen Slice.
fn analyze_slice(slice: &[i32]) {
    println!("Erstes Element des Slices: {}", slice[0]);
    println!("Der Slice hat {} Elemente", slice.len());
}

fn main() {
    // Fixgrößen-Array (Typsignatur überflüssig).
    let xs: [i32; 5] = [1, 2, 3, 4, 5];

    // Alle Elemente können auf den gleichen Wert initialisiert werden.
    let ys: [i32; 500] = [0; 500];

    // Der Index beginnt bei 0.
    println!("Erstes Element des Arrays: {}", xs[0]);
    println!("Zweites Element des Arrays: {}", xs[1]);

    // `len` gibt die Anzahl der Elemente im Array zurück.
    println!("Anzahl der Elemente im Array: {}", xs.len());

    // Arrays werden auf dem Stack zugewiesen.
    println!("Array nimmt {} Bytes ein", mem::size_of_val(&xs));

    // Arrays können automatisch als Slices entliehen werden.
    println!("Entleihe das gesamte Array als Slice.");
    analyze_slice(&xs);

    // Slices können auf einen Abschnitt eines Arrays zeigen.
    // Sie haben die Form [starting_index..ending_index].
    // `starting_index` ist die erste Position im Slice.
    // `ending_index` ist um eins größer als die letzte Position im Slice.
    println!("Entleihe einen Abschnitt des Arrays als Slice.");
    analyze_slice(&ys[1.. 4]);

    // Beispiel für einen leeren Slice `&[]`:
    let empty_array: [u32; 0] = [];
    assert_eq!(&empty_array, &[]);
    assert_eq!(&empty_array, &[][..]); // Identisch, aber ausführlicher

    // Arrays können sicher mit `.get` zugegriffen werden, was ein
    // `Option` zurückgibt. Dies kann wie unten gezeigt abgeglichen werden,
    // oder mit `.expect()` verwendet werden, wenn Sie möchten, dass das
    // Programm mit einer netten Nachricht beendet wird, anstatt glücklich
    // fortzufahren.
    for i in 0..xs.len() + 1 { // Ups, ein Element zu weit!
        match xs.get(i) {
            Some(xval) => println!("{}: {}", i, xval),
            None => println!("Langsam! {} ist zu weit!", i),
        }
    }

    // Ein Index außerhalb der Grenzen des Arrays verursacht einen
    // Compile-Zeitfehler.
    //println!("{}", xs[5]);
    // Ein Index außerhalb der Grenzen eines Slices verursacht einen
    // Laufzeitfehler.
    //println!("{}", xs[..][5]);
}

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das Arrays und Slices Lab abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.