Ich habe in der Rust-Dokumentation keine Regeln gefunden, die erklären würden, wie die Lebensdauer auf Verschlüsse zutrifft. Lassen Sie uns ein einfaches Beispiel:Warum kann Rust bei einfachen Verschlüssen nicht auf die richtige Lebensdauer schließen, oder widersprechen sie einander?
fn foo(s: &str) {
let id = |x: &str| x;
println!("{}", id(s));
}
fn main() {
foo("string");
}
Ich dachte, dass der Verschluss in der foo
Funktion wie dem folgenden Code ähnlich funktionieren würde:
fn foo(s: &str) {
struct Id; // A helper structure for closure
impl Id {
fn id(self: Self, x: &str) -> &str { &x }
}
let id = Id; // Creating a closure
println!("{}", id.id(s));
}
Letzteres funktioniert gut, aber der ehemalige nicht kompilieren und produziert eine lange Fehlermeldung über widersprüchliche Anforderungen an die Lebensdauer:
t3.rs:2:24: 2:25 error: cannot infer an appropriate lifetime due to conflicting requirements [E0495]
t3.rs:2 let id = |x: &str| x;
^
t3.rs:2:24: 2:25 note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the block at 2:23...
t3.rs:2 let id = |x: &str| x;
^
t3.rs:2:24: 2:25 note: ...so that expression is assignable (expected `&str`, found `&str`)
t3.rs:2 let id = |x: &str| x;
^
<std macros>:3:11: 3:36 note: but, the lifetime must be valid for the expression at 3:10...
<std macros>:3 print ! (concat ! ($ fmt , "\n") , $ ($ arg) *)) ;
^~~~~~~~~~~~~~~~~~~~~~~~~
<std macros>:2:25: 2:56 note: in this expansion of format_args!
<std macros>:3:1: 3:54 note: in this expansion of print! (defined in <std macros>)
t3.rs:3:5: 3:27 note: in this expansion of println! (defined in <std macros>)
<std macros>:3:11: 3:36 note: ...so type `(&&str,)` of expression is valid during the expression
<std macros>:3 print ! (concat ! ($ fmt , "\n") , $ ($ arg) *)) ;
^~~~~~~~~~~~~~~~~~~~~~~~~
<std macros>:2:25: 2:56 note: in this expansion of format_args!
<std macros>:3:1: 3:54 note: in this expansion of print! (defined in <std macros>)
t3.rs:3:5: 3:27 note: in this expansion of println! (defined in <std macros>)
error: aborting due to previous error
ich frage mich, warum Rust kann nicht die richtige Lebensdauer in einfachen Verschlüsse wie die daraus schließen, dass Ich habe oben geschrieben. Darüber hinaus, warum denkt der Compiler, dass es widersprüchliche Anforderungen für die Lebensdauer gibt.
Entfernen Sie die ': & str' und es funktioniert. Die "& str" bedeutet nicht, was Sie denken, dass es bedeutet. Ich habe jetzt keine Zeit zu erklären, wie ich im Bett sein sollte. –
Eigentlich meinte ich '& str', weil es in einem etwas komplexeren Fall notwendig ist. Auf jeden Fall war meine Frage nicht, wie man dieses triviale Beispiel zum Laufen bringt, aber was sind die Regeln hier? Warum findet der Compiler hier die widersprüchlichen Anforderungen? – svat
@ChrisMorgan: Wenn du etwas Zeit hast, wäre es großartig, wenn du erklären könntest, was vor sich geht. Ich habe das Gefühl, es könnte aufgrund einer abgeleiteten "für <'a>" sein, aber es ist nicht ganz klar ... und der Mangel an Antwort nach 20 Stunden scheint zu bedeuten, dass ich nicht der einzige bin, der unsicher ist, was los ist ^^ –