2015-07-07 22 views
10

Sto scrivendo una libreria NGram in Rust. Voglio creare un 'generico' ngram in cui la dimensione non debba essere determinata fino al momento della compilazione (a differenza di quando la codifico). Un piccolo codice potrebbe aiutare a chiarirlo.Creare un tipo generico parametrizzato da un numero

Qui è fondamentalmente quello che io voglio essere in grado di fare:

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

e poi usarlo, è sufficiente fare qualcosa di simile:

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

e si sarebbe creato un cinque -gram (o più precisamente, un Vec<[String; 5]>). È qualcosa di simile possibile. Io davvero non voglio fare qualcosa di simile:

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

Questo sarebbe in gran parte vanificato l'obiettivo di creare il tipo.

risposta

4

sarà possibile, in futuro, ma fino ad allora, il modo migliore per farlo è:

Utilizzare una caratteristica di base per un array di dimensioni fisse, la sua attuazione con le macro per tutti i formati desiderati. Con il tratto, non hai bisogno di più macro per il resto della funzionalità.

Nell'uso normale Scommetto che non c'è bisogno di digitare let vec = Ngram::<[String; 5]>::new();, si può solo dire:

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

che è leggermente migliore. Se si utilizza il tratto di supporto per vincolare il tipo di elemento dell'array su String, la scrittura non è mai ambigua.

Vedere crate arrayvec's code per ulteriori informazioni.

6

Questo non è possibile in Rust 1.0. La dimensione di un array non può essere generica.

+0

Tuttavia, potrebbe essere possibile ottenere l'equivalente scrivendo una macro, come con lo standard vec! – trentcl

+1

@trentcl Sì, penso che sia quello che dovrò fare. Ho anche trovato https://github.com/rust-lang/rfcs/issues/1038 che sembra essere esattamente quello di cui sto parlando. Spero che un giorno venga implementato. – wmaxlees

+0

@dobafresh: È molto desiderato ed è intimamente collegato alla valutazione della funzione in fase di compilazione (poiché avere solo numeri non elaborati senza la possibilità di modificarli non è altrettanto utile). –

Problemi correlati