【发布时间】:2020-02-22 11:47:41
【问题描述】:
我正在使用 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());
});
有没有办法避免这里的副本?
更新:
现在我认为这是一个愚蠢的问题。这种转换是不可能的,因为如果不创建 T 就不能拥有 &T。如果不保留对基础数据的所有权,显然无法创建Array2<u8>。我自欺欺人地认为这应该是可能的,因为 ArrayView 和 &Array 都不拥有数据。
【问题讨论】:
-
很难回答您的问题,因为它不包含minimal reproducible example。我们无法分辨代码中存在哪些 crate(及其版本)、类型、特征、字段等。如果您尝试在 Rust Playground 上重现您的错误,如果可能的话,这将使我们更容易为您提供帮助,否则在全新的 Cargo 项目中,然后在 edit 您的问题中包含附加信息。您可以使用Rust-specific MRE tips 来减少您在此处发布的原始代码。谢谢!
标签: multidimensional-array rust borrowing