2015-07-07 5 views
10

Ich schreibe eine NGram-Bibliothek in Rust. Ich möchte ein 'generisches' Ngram erstellen, in dem die Größe nicht vor der Kompilierungszeit bestimmt werden muss (im Gegensatz zu dem, wenn ich es kodiere). Ein kleiner Code könnte dazu beitragen, dies zu verdeutlichen. HierErstellen Sie einen generischen Typ, der durch eine Nummer parametrisiert wird

ist im Grunde, was ich in der Lage sein zu tun:

pub type Ngram<N> = Vec<[String; N]>; 

und dann, es zu benutzen, geben Sie einfach etwas tun, wie folgt aus:

let vec = Ngram::<5>::new(); 

Und Sie würden eine fünf angelegt haben -Gramm (oder genauer gesagt Vec<[String; 5]>). Ist so etwas möglich? Ich möchte wirklich so etwas nicht machen:

pub type Ngram<N> = Vec<N>; 
... 
let vec = Ngram::<[String; 5]>::new(); 

Das würde meist den Zweck der Schaffung des Typs besiegen.

Antwort

4

Es wird in Zukunft möglich sein, aber bis dahin ist der beste Weg, es zu tun ist:

ein Basismerkmal für eine feste Größe Array verwenden, implementieren sie mit Makros für alle Größen, die Sie benötigen. Mit dem Merkmal benötigen Sie für den Rest der Funktionalität nicht mehr Makros.

Im normalen Gebrauch Ich wette, dass Sie müssen let vec = Ngram::<[String; 5]>::new(); nicht geben, können Sie einfach sagen:

let vec = Ngram::<[_; 5]>::new(); 

die etwas besser ist. Wenn Sie Ihr unterstützendes Merkmal verwenden, um den Elementtyp des Arrays auf String zu beschränken, ist dieses Schreiben nie mehrdeutig.

Weitere Informationen finden Sie unter crate arrayvec's code.

6

Dies ist in Rust 1.0 nicht möglich. Die Größe eines Arrays kann nicht generisch sein.

+0

Es kann jedoch möglich sein, das Äquivalent durch Schreiben eines Makros zu erreichen, wie bei der Standardversion vec! – trentcl

+1

@trentcl Ja, ich denke, das muss ich tun. Ich habe auch https://github.com/rust-lang/rfcs/issues/1038 gefunden, was genau das zu sein scheint, worüber ich spreche. Hoffentlich wird es eines Tages umgesetzt. – wmaxlees

+0

@dobafresh: Es ist sehr erwünscht und eng mit der Auswertung der Kompilierzeitfunktion verbunden (da nur rohe Zahlen ohne die Fähigkeit, sie zu modifizieren, nicht so nützlich sind). –

Verwandte Themen