Voici le code:paramètre de vie identique pour tous les champs d'une struct
#[derive(Debug)]
struct Foo {
f: i32,
}
#[derive(Debug)]
struct Bar<'a> {
bar1: &'a Foo,
bar2: &'a Foo,
}
#[allow(unused_variables)]
fn make_bar<'a>(foo1: &'a Foo, foo2: &'a Foo) -> Bar<'a> {
Bar {
bar1: foo1,
bar2: foo2,
}
}
fn extract_bar2<'a>(foo: &'a Foo) -> &'a Foo {
let foo1 = Foo { f: 22 };
let foo2 = make_bar(&foo, &foo1).bar1;
foo2
}
fn main() {
let foo = Foo { f: 11 };
let foo1 = extract_bar2(&foo);
println!("foo1: {:?}", foo1);
}
Cela donne une erreur:
error: `foo1` does not live long enough
--> src/main.rs:23:32
|>
23 |> let foo2 = make_bar(&foo, &foo1).bar1;
|> ^^^^
note: reference must be valid for the lifetime 'a as defined on the block at 21:45...
--> src/main.rs:21:46
|>
21 |> fn extract_bar2<'a>(foo: &'a Foo) -> &'a Foo {
|> ^
note: ...but borrowed value is only valid for the block suffix following statement 0 at 22:29
--> src/main.rs:22:30
|>
22 |> let foo1 = Foo { f: 22 };
|> ^
La question fondamentale est: Qu'est-ce qu'un paramètre à vie signifie réellement dans la contexte d'une structure?
Plus précisément: Quelles sont les conséquences d'avoir le même paramètre de durée de vie pour tous les champs d'une structure? Est-ce que leur durée de vie doit être exactement la même? Doivent-ils se chevaucher? Si oui, dans quelle mesure devraient-ils se chevaucher? Quelles sont les différences sémantiques et pratiques entre les deux structures suivantes?
struct Bar<'b> {
bar1: &'b Foo,
bar2: &'b Foo,
}
struct Bar<'a, 'b> {
bar1: &'a Foo,
bar2: &'b Foo,
}
[Une question par question, s'il vous plaît] (http://meta.stackexchange.com/q/39223/281829). Votre deuxième moitié est [déjà répondu] (http://stackoverflow.com/q/29861388/155423). Le style de codage Rust est 'snake_case', pas' camelCase'. – Shepmaster
Avez-vous regardé l'une des [91 questions existantes avec le même message d'erreur] (http://stackoverflow.com/search?q=%5Brust%5D+%22does+not+live+long+enough%22+is% 3Aq)? En quoi cette question diffère-t-elle de celles-ci? S'il vous plaît montrer [quel effort vous avez déjà fait pour résoudre le problème] (http://meta.stackoverflow.com/q/261592/155423). – Shepmaster
Je ne demande pas comment éliminer cette erreur, je sais comment le faire. Une meilleure compréhension des paramètres de durée de vie est ce que je suis après. – qed