如何引用二维数组?

How to reference 2d array?

我正在尝试将新初始化的二维字符数组传递给结构;它说类型不匹配,我不知道如何正确地做到这一点;

Screenshot of code and error message

struct Entity<'a> {
    dimensions: Vec2,
    sprite: &'a mut[&'a mut [char]]
}

impl Entity {

    fn new<'a>() -> Self {

        let mut sp = [[' '; 3]; 4];
        for y in 0..sp.len() {
            for x in 0..sp[y].len() {
                sp[y][x] = '$';
            }
        }
    
        return Entity{dimensions: Vec2::xy(3, 4), sprite: &mut sp }
    }
}

我认为有一些事情正在发生。

1.) &'a mut[&'a mut [char]] 引用了一个包含可变字符切片的可变切片。您正在构建的是一个固定的字符数组矩阵,然后尝试 return 对其进行可变引用。这些不是可互换的类型。

2.) 您正在尝试 return 引用在 new 中创建的数据,由于局部变量的生命周期,这不会像那样工作。

另一种可能是您想要的方法是将结构定义为包含固定大小的数组矩阵。像这样:

struct Entity {
    sprite: [[char; 3]; 4]
}

impl Entity {

    fn new() -> Self {
    
        let mut sp = [[' '; 3]; 4];
        for y in 0..sp.len() {
            for x in 0..sp[y].len() {
                sp[y][x] = '$';
            }
        }

        return Entity{sprite: sp }
    }
}

或者您甚至可以针对不同的大小使用 const 泛型:

struct Entity<const W: usize, const H: usize> {
    sprite: [[char; W]; H]
}

 impl<const W: usize, const H: usize> Entity<W, H> {

     fn new() -> Self {
    
        let mut sp = [[' '; W]; H];
        for y in 0..sp.len() {
            for x in 0..sp[y].len() {
                sp[y][x] = '$';
            }
        }
    
        return Entity{sprite: sp }
    }
}

如果在编译时无法知道精灵的大小,则需要使用动态大小的数据结构来定义它,例如 Vec。即,Vec<Vec<char>>.