Einführung
In diesem Lab lernen wir, dass Closures als Eingabeparameter verwendet werden können und auch als Ausgabeparameter zurückgegeben werden können, indem wir impl Trait verwenden und die gültigen Traits (Fn, FnMut, FnOnce) angeben. Das move-Schlüsselwort wird verwendet, um anzuzeigen, dass alle Captures per Wert erfolgen, um ungültige Referenzen zu vermeiden.
Hinweis: Wenn das Lab keinen Dateinamen angibt, können Sie einen beliebigen Dateinamen verwenden. Beispielsweise können Sie
main.rsverwenden und es mitrustc main.rs &&./mainkompilieren und ausführen.
Als Ausgabeparameter
Es ist möglich, Closures als Eingabeparameter zu verwenden, daher sollte es auch möglich sein, Closures als Ausgabeparameter zurückzugeben. Da anonyme Closure-Typen per Definition unbekannt sind, müssen wir impl Trait verwenden, um sie zurückzugeben.
Die gültigen Traits für das Zurückgeben eines Closures sind:
FnFnMutFnOnce
Darüber hinaus muss das move-Schlüsselwort verwendet werden, was signalisiert, dass alle Captures per Wert erfolgen. Dies ist erforderlich, da alle Captures per Referenz sofort fallen würden, sobald die Funktion beendet wird, was zu ungültigen Referenzen im Closure führt.
fn create_fn() -> impl Fn() {
let text = "Fn".to_owned();
move || println!("This is a: {}", text)
}
fn create_fnmut() -> impl FnMut() {
let text = "FnMut".to_owned();
move || println!("This is a: {}", text)
}
fn create_fnonce() -> impl FnOnce() {
let text = "FnOnce".to_owned();
move || println!("This is a: {}", text)
}
fn main() {
let fn_plain = create_fn();
let mut fn_mut = create_fnmut();
let fn_once = create_fnonce();
fn_plain();
fn_mut();
fn_once();
}
Zusammenfassung
Herzlichen Glückwunsch! Sie haben das Lab As Output Parameters abgeschlossen. Sie können in LabEx weitere Labs ausprobieren, um Ihre Fähigkeiten zu verbessern.