Я использую ящик ndarray
, и у меня есть функция, которая принимает ссылку на Array2
:
fn use_array(array: &Array2<u8>) {
// ...
}
Я пытаюсь вызвать эту функцию с видом:
image.axis_iter(Axis(2)).for_each(|layer| {
fun(&layer.to_owned());
});
Это приводит к ошибке:
|
92 | fun(&layer);
| ^^^^^^ expected struct `ndarray::OwnedRepr`, found struct `ndarray::ViewRepr`
|
error: could not compile `poisson-editing`.
warning: build failed, waiting for other jobs to finish...
= note: expected type `&ndarray::ArrayBase<ndarray::OwnedRepr<u8>, ndarray::dimension::dim::Dim<[usize; 2]>>`
found type `&ndarray::ArrayBase<ndarray::ViewRepr<&u8>, ndarray::dimension::dim::Dim<[usize; 2]>>`
Я могу решить ее, владея элементами массива, но затем я создаю ненужную копию массива.
image.axis_iter(Axis(2)).for_each(|layer| {
use_array(&layer.to_owned());
});
Есть ли способ избежать копирования здесь?
Обновление:
Теперь я считаю это глупым sh вопросом. Это преобразование невозможно, потому что вы не можете получить &T
без создания T
. Очевидно, что невозможно создать Array2<u8>
без сохранения прав собственности на базовые данные. Я заблуждаюсь, думая, что это возможно, потому что ArrayView
и &Array
не владеют данными.