将二维固定大小数组转换为切片

Wim*_*m V 0 rust

对于一维数组,可以从固定大小的数组转换为切片,但是对于二维数组来说,这是否可以以一种简单的方式实现?

fn foo(r: &[&[usize]]) { }
let r = [[0usize; 10]; 10];
foo(&r); //<== error expected type `&[&[usize]]` found type `&[[usize; 10]; 10]`
Run Code Online (Sandbox Code Playgroud)

mal*_*rbo 5

没有简单的方法可以做到这一点(对于一些简单的定义)。问题是&[&[usize]]是切片的切片(如锯齿状数组),而[[0usize; 10]; 10]是二维数组。二维数组中的数据是连续的,一行从前一行的末尾开始,并且所有行具有相同数量的元素。在交错数组中,每行可以有不同的长度,并且这个长度必须与每行一起存储(在 Rust 中,切片是一个长度和一个指针)。

也就是说,您可以更改定义foo(这是最好的选择,因为没有额外的分配):

// a slice of T, where T can be used as &[usize]
fn foo<T>(r: &[T])
    where T: AsRef<[usize]>
{
    for line in r {
        println!("{:?}", line.as_ref());
    }
}

fn main() {
    let r = [[0usize; 10]; 10];
    foo(&r);
}
Run Code Online (Sandbox Code Playgroud)

或创建一个临时的切片向量:

fn foo(r: &[&[usize]]) {
    for line in r {
        println!("{:?}", line);
    }
}

fn main() {
    let r = [[0usize; 10]; 10];
    let x: Vec<&[usize]> = r.iter().map(|v| v.as_ref()).collect();
    foo(&x);
}
Run Code Online (Sandbox Code Playgroud)