2016-11-01 5 views
2

Ich verstehe dies in Rust illegal ist:Möglich, eine Struktur/Tupel von Eigenschaften in Rust zu haben?

trait A { } 
struct S { a: A, b: A } 

Der Grund dafür ist, dass alle Mitglieder mit Ausnahme der letzten bemessen sein muss, und ein Merkmal ist nicht Größe.

Bedeutet das, dass es unmöglich ist, eine Struktur/ein Tupel von Merkmalen zu haben? Wie würde ich ein Paar Werte von einer Funktion zurückgeben und ich weiß nur, dass sie ein bestimmtes Merkmal implementieren?

Antwort

7

Sie haben bereits das Problem erkannt, dass der Typ keine Größe hat, Sie müssen ihn also nur in einen Größen-Typ umwandeln.

Wenn Sie die Objekte nicht besitzen, können Sie Referenz verwenden.

struct S1<'a> { 
    a: &'a A, 
    b: &'a A, 
} 

Sie können zwei Lebenszeiten statt einer verwenden, wenn sie unterschiedlich sind.

struct S1<'a, 'b> { 
    a: &'a A, 
    b: &'b A, 
} 

Wenn Sie die Objekte besitzen möchten, können Sie Box verwenden.

struct S2 { 
    a: Box<A>, 
    b: Box<A>, 
} 

Wenn Sie darüber hinaus die konkrete Art zum Zeitpunkt der Kompilierung kennen, und Sie wollen einfach nur generischen Code schreiben, können Sie auch generische Struktur schreiben

struct S3<A1: A, A2: A> { 
    a: A1, 
    b: A2, 
} 

In S3 jeder A1 oder A2 stellt einen konkreter Typ, der das Merkmal A implementiert, wenn Sie es in Ihrem Code instanziieren.

+0

Danke. Ich denke, S3 ist was ich suche, aber wie macht diese Deklaration die Größe der Struktur so groß, dass der Compiler sich nicht beschweren kann? – rityzmon

+0

@RYYZMON, weil 'A1' und' A2' tatsächliche Typen sind, wenn sie instanziiert werden, obwohl die Eigenschaft 'A' nicht groß ist. Sie müssen den Typ "A1" und "A2" angeben, wenn Sie die generische Struktur in Ihrem Code verwenden. So (und wann) kennt der Compiler die Größe Ihrer Typen, weil Sie dem Compiler buchstäblich sagen, was genau diese Typen sind. – WiSaGaN

+0

Danke. Und wie würde ich die gleiche Technik verwenden, wenn ich ein Tupel von Merkmalen von einer Funktion zurückgeben möchte? Ein spezifisches Problem, das ich herausfinden möchte, ist 'Merkmal T {fn func (& Selbst, x: & Selbst) -> (Selbst, Selbst); } '. Die einzelne Funktion in der Eigenschaft nimmt ein anderes Objekt des gleichen Typs und gibt zwei weitere Objekte desselben Typs zurück. – rityzmon

Verwandte Themen