Как инициализировать массив generi c с ящиком generi c в виде ржавчины? - PullRequest
1 голос
/ 05 апреля 2020

Я использую generi c -array crate:

struct Foo<N: ArrayLength<i32>> {
    data: GenericArray<i32, N>
}

Но это не объясняет, как инициализировать значение:

impl<N: ArrayLength<i32>> Foo<N> {
    pub fn new() -> Self {
        Self {
            data: // What to puts here?
        }
    }
}

Playground здесь , чтобы помочь тестировщикам.

1 Ответ

2 голосов
/ 05 апреля 2020

Вы можете инициализировать их по умолчанию и впоследствии изменять их:

let mut data = GenericArray::default();
for x in &mut data {
    *x = 33;
}

Или вы можете использовать функцию GenericArray::from_exact_iter. Проблема в том, что не существует простого способа создать итератор из n элементов, который также реализует ExactSizeIterator. Вы можете реализовать один из них:

struct RepeatN<T>{
    item: T,
    count: usize,
}

impl<T: Clone> Iterator for RepeatN<T> {
    type Item = T;

    fn next(&mut self) -> Option<T> {
        self.count.checked_sub(1).map(|count| {
            self.count = count;
            self.item.clone()
        })
    }

    fn size_hint(&self) -> (usize, Option<usize>) {
        (self.count, Some(self.count))
    }
}

impl<T: Clone> ExactSizeIterator for RepeatN<T> {
    fn len(&self) -> usize {
        self.count
    }
}

fn repeat_n<T: Clone>(item: T, count: usize) -> RepeatN<T> {
    RepeatN {
        item,
        count,
    }
}

И использовать его как GenericArray::from_exact_iter(repeat_n(33, N::to_usize())).unwrap().

...