rust 数组切片的数组切片

xytpbqjk  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(142)

我有一个2D数组,我想用一个函数来改变它,我还不知道向量,但是因为数组是固定大小的,所以我不需要向量,我想给予这个函数一个数组切片的数组切片,比如fn my_func (arr: &mut [&mut [char]]) {...},但是我不知道如何从我的int main函数中调用它。
这是我一直在研究的一个例子。

fn main() {
    let mut map = [['-'; 3]; 3];

    for row in map {
        for col in row {
            print!("{} ", col);
        }

        println!("");
    }

    println!("Changing...");
    put_plus(???);

    for row in map {
        for col in row {
            print!("{} ", col);
        }

        println!("");
    }
}

fn put_plus(map: &mut [&mut [char]]) {
    map[map.len() - 1][map[map.len() - 1].len() - 2] = '+';
}

我期望的输出是:

- - - 
- - - 
- - - 
Changing...
- - -
- - -
- + -

是否有一个表达式可以将[[char; 3]; 3]转换为[[char]],这样我就可以用这个表达式代替???,并且一切正常?

kx5bkwkv

kx5bkwkv1#

下面是一个适用于所有尺寸的加号函数:

fn put_plus<const COUNT: usize>(map: &mut [[char; COUNT]; COUNT]) {
    map[map.len() - 1][map[map.len() - 1].len() - 2] = '+';
}

正如在注解中指出的,你只需要一个“外部”结构体上的可变引用。在Rust中,你不在“元素”级别控制可变性。相反,容器的可变性扩展到该容器中的所有元素。你不能有,例如,一个可变向量包含不变向量或一个可变数组包含不变数组。
因此,只要将一个&mut放到数组的“外部”,就意味着数组中的所有内容(包括内部数组以及这些内部数组中包含的值)都是可变的。
编辑:我的put_plus版本只适用于方阵,正如评论者@cafce25所指出的,可以去掉外部的:COUNT,这样会使它更通用

相关问题