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>
)
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
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. –