2017-07-24 5 views
-1

Folgendes wird nicht kompilieren:Warum wird eine Lebensdauer für eine Struktur verwendet, auf die ich einen Verweis habe?

struct Person<'z> { 
    street_address: String, 
    postcode: String, 
    city: String, 

    company_name: String, 
    position: String, 
    annual_income: usize, 
} 

struct PersonBuilder<'z> { 
    person: &'z Person<'z>, 
} 

impl<'z> PersonBuilder<'z> { 
    fn new() -> PersonBuilder<'z> { 
     PersonBuilder { 
      person: Person { 
       street_address: "".to_string(), 
       postcode: "".to_string(), 
       city: "".to_string(), 
       company_name: "".to_string(), 
       position: "".to_string(), 
       annual_income: 0, 
      }, 
     } 
    } 
} 
error[E0392]: parameter `'z` is never used 
--> src/main.rs:1:15 
    | 
1 | struct Person<'z> { 
    |    ^^ unused type parameter 
    | 
    = help: consider removing `'z` or using a marker such as `std::marker::PhantomData` 

Aber das ist nicht wahr, oder? Ich meine, PersonBuilder hält einen Verweis auf eine Person als Person<'z> und wenn ich es mit PersonBuilder::new() instanziieren, ist eindeutig der Typ Parameter im Spiel, um die beiden Lebenszeiten zusammen zu binden. Also, was ist hier los?

+2

Ich sehe keine tatsächliche Nutzung von ' 'Z' Lebensdauer für' Person'; nichts Seltsames hier. – ljedrz

+2

Warum verwenden Sie nicht 'String :: new()' anstelle von '" ".to_string()'? – Boiethios

+1

Außerdem sollten Sie 'to_owned' anstelle von' to_string' verwenden, um & str in String zu konvertieren. –

Antwort

5

Der Compiler ist hier vollständig korrekt; 'z wird nicht auf Person verwendet. Entfernen Sie es aus Person und von PersonBuilder:

struct Person { /* ... */ } 

struct PersonBuilder<'z> { 
    person: &'z Person, 
} 

One man, dass entfernen, was Sie versuchen, ist unmöglich zu tun. Siehe Is there any way to return a reference to a variable created in a function?. Entfernen Sie alle Lebenszeiten und Referenzen aus Ihrem Code und es funktioniert.


PersonBuilder keeps a reference to a person

Ja, das ist es, was &Person wäre.

as Person<'z>

Person<'z> anzeigt, dass die Person struct enthält eine Referenz der spezifizierten Lebensdauer. &'z Person ist eine Referenz auf eine Person mit der angegebenen Lebensdauer.

instantiate it with PersonBuilder::new() , clearly the type parameter

Auf welchen "Typparameter" beziehen Sie sich, da ich in diesem Code keine sehe. Es stimmt zwar, dass Lebensdauern und Typparameter beide Arten von Generika sind, sie sind verschiedene Arten von Generika und werden nicht gleich behandelt.


Sie auch das Merkmal interessiert sein Default:

#[derive(Debug, Default)] 
struct Person { /* ... */ } 

impl PersonBuilder { 
    fn new() -> PersonBuilder { 
     PersonBuilder { 
      person: Person::default(), 
     } 
    } 
} 
+0

Ich habe versucht, die Lebensdauer zu entfernen, aber dann andere Teile Unterbrechung. Independent-Beispiel hier: https://gist.github.com/nesteruk/8b6e967affbd27e6c099f20be18d157a –

+0

@DmitriNesteruk bitte gehen Sie zurück und lesen Sie erneut meine Antwort. Meine ** dritten ** und ** vierten ** Sätze erklären diesen Fehler: * Einen, den du entfernst, was du versuchst, ist unmöglich. Siehe [Gibt es eine Möglichkeit, einen Verweis auf eine in einer Funktion erstellte Variable zurückzugeben?] (Https://stackoverflow.com/q/32682876/155423). * Dann erklärt mein ** fünfter ** Satz, wie Sie ihn beheben können: * Entfernen Sie alle Lebenszeiten und Referenzen aus Ihrem Code und es wird funktionieren. * – Shepmaster

+0

, dass allein nicht geholfen: https://gist.github.com/nesteruk/d1fcfbd8d9fbedce27a478a26a8d65cf –

Verwandte Themen