Es gibt bereits viele Themen zu diesem Thema, aber ich sehe nicht, ob die besprochenen Probleme auf mein spezifisches Problem zutreffen.Funktionsreferenzen: erwarteter gebundener Lebensdauerparameter, gefundene konkrete Lebensdauer [E0271]
Ich habe eine Struktur, die eine name
und eine callback
Funktion speichert. Abgespeckte auf das Problem sieht es wie folgt aus: (. Und prob mehr Sachen in der Zukunft)
pub struct Command<'a> {
name: &'a str,
callback: &'a Fn(&[&str]) ->()
}
impl <'a> Command<'a> {
pub fn new(name: &'a str, callback: &'a Fn(&[&str]) ->()) -> Command<'a> {
Command {
name: name,
callback: callback
}
}
}
Was ich tun möchte, ist speichern Sie eine Callback-Funktion mit einem Namen verbunden.
Aber wenn ich versuche, dieses Stück Code zu verwenden, etwa so:
fn main() {
let play_callback = |args| {
println!("Playing something.");
for arg in args {
println!("{}", arg);
}
};
let play_command = Command::new("play", &play_callback);
}
bekomme ich folgende Fehlermeldung:
src/main.rs:22:42: 22:56 error: type mismatch resolving `for<'r, 'r> <[[email protected]/main.rs:16:22: 21:3] as std::ops::FnOnce<(&'r [&'r str],)>>::Output ==()`:
expected bound lifetime parameter ,
found concrete lifetime [E0271]
src/main.rs:22 let play_command = Command::new("play", &play_callback);
^~~~~~~~~~~~~~
Ich habe versucht, die Schließung wie diese
fn main() {
let play_command = Command::new("play", &|args| {
println!("Playing something.");
for arg in args {
println!("{}", arg);
}
});
}
Inline
aber dann bekomme ich einen anderen Fehler
src/main.rs:16:47: 21:7 error: borrowed value does not live long enough
was ich glaube ich verstehe, warum ich bekomme.
Ich habe versucht, einen generischen Typparameter für Command
Verwendung vor dem ersten zu einer Funktionsreferenz Schalt in meiner Command
Struktur zu speichern, aber wenn ich einen HashSet
von Befehlsobjekten wie folgt initialisieren wollte:
let mut commands: HashSet<Command> = HashSet::new();
der Compiler wollte, dass ich den generischen Parameter spezifiziere, von dem ich glaube, dass ich das nicht tun kann, dass das bedeuten würde, dass ich nur die gleiche Schließung in allen meinen Command
Objekten speichern könnte.
Also meine Frage wäre: Wie kann ich erreichen, was ich will und was ist der beste Weg (und warum)?
Das hilft viel, danke. –