2015-07-07 16 views
10

Piszę bibliotekę NGram w Rust. Chcę utworzyć "ogólny" ngram, w którym rozmiar nie musi być określany do czasu kompilacji (w przeciwieństwie do kiedy go koduję). Mały kod może pomóc to wyjaśnić.Tworzenie ogólnego typu sparametryzowanego przez numer

Tutaj jest po prostu to, co chcę, aby być w stanie to zrobić:

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

i następnie go używać, po prostu zrobić coś takiego:

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

I byś stworzył pięć -gram (a dokładniej: Vec<[String; 5]>). Czy coś takiego jest możliwe. Naprawdę nie chcę robić czegoś takiego:

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

To w dużej mierze zniszczyłoby cel stworzenia tego typu.

Odpowiedz

4

To będzie możliwe w przyszłości, ale do tej pory, najlepszym sposobem na to jest:

Użyj cechę podstawową dla tablicy stałym rozmiarze, wdrożyć go z makr dla wszystkich rozmiarów trzeba. Dzięki tej funkcji nie potrzebujesz więcej makr do końca funkcjonalności.

W normalnym użytkowaniu Założę się, że nie trzeba wpisywać let vec = Ngram::<[String; 5]>::new();, można po prostu powiedzieć:

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

który jest nieco lepiej. Jeśli użyjesz cechy pomocniczej, aby ograniczyć typ elementu tablicy do String, to pisanie nigdy nie jest niejednoznaczne.

Aby uzyskać więcej informacji, patrz crate arrayvec's code.

6

Nie jest to możliwe w Rust 1.0. Rozmiar tablicy nie może być ogólny.

+0

Możliwe jest jednak uzyskanie równoważnika przez napisanie makra, tak jak w przypadku standardowego vec! – trentcl

+1

@trentcl Tak, myślę, że to właśnie będę musiał zrobić. Znalazłem także https://github.com/rust-lang/rfcs/issues/1038, który wydaje się być dokładnie tym, o czym mówię. Mam nadzieję, że pewnego dnia zostanie on wdrożony. – wmaxlees

+0

@dobafresh: Jest bardzo pożądany i ściśle związany z oceną funkcji podczas kompilacji (ponieważ posiadanie tylko nieprzetworzonych liczb bez możliwości ich modyfikacji nie jest tak użyteczne). –

Powiązane problemy