Rust-Funktionssignaturen mit Lebensdauern

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 mit Lebensdauern in Rust auf Funktionssignaturen eingestuft, wobei jede Referenz eine annotierte Lebensdauer haben muss und jede zurückgegebene Referenz die gleiche Lebensdauer wie eine Eingabe haben muss oder static sein muss. Es ist wichtig zu beachten, dass das Zurückgeben von Referenzen ohne Eingabe verboten ist, wenn dies zu einem Zurückgeben von Referenzen auf ungültige Daten führen würde. Die bereitgestellten Beispiele veranschaulichen gültige Formen von Funktionen mit Lebensdauern, einschließlich Funktionen mit einer Eingabereferenz, Funktionen mit mutablen Referenzen, Funktionen mit mehreren Elementen und unterschiedlicher Lebensdauer sowie Funktionen, die Referenzen zurückgeben, die als Parameter übergeben wurden.

Hinweis: Wenn im Lab kein Dateiname angegeben ist, 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/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/BasicConceptsGroup -.-> rust/mutable_variables("Mutable Variables") rust/DataTypesGroup -.-> rust/integer_types("Integer Types") rust/DataTypesGroup -.-> rust/string_type("String Type") rust/DataTypesGroup -.-> rust/type_casting("Type Conversion and Casting") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") subgraph Lab Skills rust/variable_declarations -.-> lab-99205{{"Rust-Funktionssignaturen mit Lebensdauern"}} rust/mutable_variables -.-> lab-99205{{"Rust-Funktionssignaturen mit Lebensdauern"}} rust/integer_types -.-> lab-99205{{"Rust-Funktionssignaturen mit Lebensdauern"}} rust/string_type -.-> lab-99205{{"Rust-Funktionssignaturen mit Lebensdauern"}} rust/type_casting -.-> lab-99205{{"Rust-Funktionssignaturen mit Lebensdauern"}} rust/function_syntax -.-> lab-99205{{"Rust-Funktionssignaturen mit Lebensdauern"}} rust/expressions_statements -.-> lab-99205{{"Rust-Funktionssignaturen mit Lebensdauern"}} rust/method_syntax -.-> lab-99205{{"Rust-Funktionssignaturen mit Lebensdauern"}} end

Funktionen

Wenn man [Elision] ignoriert, haben Funktionssignaturen mit Lebensdauern einige Einschränkungen:

  • Jede Referenz muss eine annotierte Lebensdauer haben.
  • Jede zurückgegebene Referenz muss die gleiche Lebensdauer wie eine Eingabe haben oder static sein.

Zusätzlich ist zu beachten, dass das Zurückgeben von Referenzen ohne Eingabe verboten ist, wenn dies zu einem Zurückgeben von Referenzen auf ungültige Daten führen würde. Das folgende Beispiel zeigt einige gültige Formen von Funktionen mit Lebensdauern:

// Eine Eingabereferenz mit der Lebensdauer `'a`, die mindestens so lange
// existieren muss wie die Funktion.
fn print_one<'a>(x: &'a i32) {
    println!("`print_one`: x ist {}", x);
}

// Mutabele Referenzen sind auch mit Lebensdauern möglich.
fn add_one<'a>(x: &'a mut i32) {
    *x += 1;
}

// Mehrere Elemente mit unterschiedlicher Lebensdauer. Im diesem Fall
// wäre es auch in Ordnung, wenn beide die gleiche Lebensdauer `'a` hätten,
// aber in komplexeren Fällen können unterschiedliche Lebensdauern erforderlich sein.
fn print_multi<'a, 'b>(x: &'a i32, y: &'b i32) {
    println!("`print_multi`: x ist {}, y ist {}", x, y);
}

// Das Zurückgeben von Referenzen, die als Parameter übergeben wurden, ist akzeptabel.
// Allerdings muss die richtige Lebensdauer zurückgegeben werden.
fn pass_x<'a, 'b>(x: &'a i32, _: &'b i32) -> &'a i32 { x }

//fn invalid_output<'a>() -> &'a String { &String::from("foo") }
// Das obige ist ungültig: `'a` muss länger als die Funktion existieren.
// Hier würde `&String::from("foo")` ein `String` erstellen, gefolgt von einer
// Referenz. Dann wird das Datenobjekt beim Verlassen des Bereichs gelöscht,
// sodass eine Referenz auf ungültige Daten zurückgegeben wird.

fn main() {
    let x = 7;
    let y = 9;

    print_one(&x);
    print_multi(&x, &y);

    let z = pass_x(&x, &y);
    print_one(z);

    let mut t = 3;
    add_one(&mut t);
    print_one(&t);
}

Zusammenfassung

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