Im正在尝试将新初始化的2d字符数组传递到结构;它说类型不匹配,我不知道如何正确地做到这一点;
代码和错误消息屏幕截图
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]]
引用包含字符的可变切片的可变切片。您正在构建的是一个固定的字符数组矩阵,然后尝试返回对该矩阵的可变引用。这些类型不能互换。
2.)您正试图返回对在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>>
。