2016-04-16 4 views
0

Ich versuche, eine B-Tree-Klasse für die Praxis in Rust zu implementieren, die bei verschiedenen verschiedenen Werten von b instanziiert werden kann. Ich habe den folgenden Code versucht:Größe Typ Parameter in benutzerdefinierten Datentypen in Rust?

struct BTreeNode<T, b> { 
    vals: [Option<T>; b-1], 
    children: [Option<Box<BTreeNode<T, b>>>; b], 
} 

struct BTree<T, b> { 
    root: Option<BTreeNode<T, b>>, 
} 

aber der Compiler (vernünftigerweise) beklagt, dass

src/two_three_tree.rs:2:15: 2:16 error: unresolved name `b` [E0425] 
src/two_three_tree.rs:2  vals: [Option<T>; b-1], 
           ^
... 
src/two_three_tree.rs:2:15: 2:16 error: array length constant evaluation error: non-constant path in constant expression [E0250] 
src/two_three_tree.rs:2  vals: [Option<T>; b-1], 
           ^
... 

Es ist wie die B-Tree-Klasse in der Standardbibliothek sieht nur eine Konstante verwendet (was a vernünftige Wahl, da B-Trees in der Regel den Cache optimal ausnutzen sollen, ich versuche es nur auf eine allgemeinere Art und Weise. Ist das in der aktuellen Version von Rust möglich? Wenn nicht, wird es jemals möglich sein?

(ich stelle mir vor, indem er BTree<u32, 3> einen 2-3-Baum von u32s erstellen oder ein 2-3-4-Baum von u32s durch Schreiben BTree<u32, 4>)

+1

Sie suchen nach * Typ Ganzzahlen *. Eine solche Sache (die nützlich sein kann oder nicht) ist [typenum] (https://github.com/paholg/typenum). Beachten Sie, dass frühere Versionen von Rust den Parameter "b" als Konstruktorparameter verfügbar gemacht haben. die Array-Größe war dann wahrscheinlich nur ein 'Vec'. – Shepmaster

+0

Ich glaube nicht, dass es das tut, was ich will, aber es ist wirklich cool, und ich denke, seine Existenz zeigt, dass Arrays vom Design her einzigartig sind, da ihr Typ von einem ganzzahligen Literal abhängt. –

Antwort

1

Zunächst einmal sind Sie mit b als Geben Sie dann als Wert die Länge des Arrays ein? Ich bin mir nicht sicher, was du damit meinst.

Zweitens muss die Größe eines Arrays zur Kompilierzeit bekannt sein. Da Sie die Größe des Arrays zum Zeitpunkt der Kompilierung nicht kennen, ist es besser, einen Vektor zu verwenden.

+0

Gemäß [Rust by example] (http://rustbyexample.com/primitives/array.html) "werden Arrays mit eckigen Klammern [] erstellt und ihre Größe, die zur Kompilierungszeit bekannt ist, ist Teil ihrer Typsignatur [T; Größe] ". Ich versuche nicht, 'b' als eine Variable zu verwenden, als wenn ich ein Array erstellen würde (es ist hier genau so konstant wie für reguläre Arrays, da Rust Kompilierzeit-Polymorphismus pro Typinstanz verwendet)). Jede bestimmte Instanz hat eine Größe, die zur Kompilierungszeit bekannt ist; Wenn Sie möchten, ignorieren Sie diese "b-1" -Zeile; Sie erhalten immer noch Kompilierungsfehler. –

+0

Ich stelle mir vor, einen 2-3 Baum von u32s zu erstellen, indem ich 'BTree ' schreibe, oder einen 2-3-4 Baum von u32s indem ich 'BTree ' –

+2

schreibe Ah! Aber Rust wird "b" als einen Typ interpretieren, weil die spitzen Klammern nach dem Typ die Typparameter für ein generisches angeben. Wenn Sie die Größe des Vars-Arrays zur Laufzeit nicht kennen, müssen Sie etwas anderes verwenden, wahrscheinlich einen Vector. Sie können die Größe des Vektors dynamisch in einem Konstruktor auswählen, der einen geeigneten Parameter verwendet. – GaiusOctavian

Verwandte Themen