【发布时间】:2018-03-14 18:04:05
【问题描述】:
我正在制作一个玩具 roguelike,并有一个 Level 结构来存储游戏地图,其中最简单的实现是 2D 向量。
我正在关注this tutorial,它使用Vectors 的Vector,但指出为了提高性能,也可以使用大小为MAP_HEIGHT * MAP_WIDTH 的单个Vector,并在以下位置访问磁贴(x, y) 可以直接访问map[y * MAP_WIDTH + x]。
我正在尝试实现这种更快的方法,但是使用 getter 和 setter 很笨重,而且公共字段也不是那么好。我更喜欢它感觉像一个 2D 矢量。
为此,我需要为我的班级实现 Index 特征,但我不确定如何获得我想要的结果。也许通过嵌套impls?我真的不知道。
这是我的代码,尝试为我的结构实现Index,这显然不适合我的目的,因为它是一维的:
const MAP_WIDTH: i32 = 80;
const MAP_HEIGHT: i32 = 45;
pub struct Level {
map: Vec<Tile>,
}
impl Level {
pub fn new() -> Self {
Level { map: vec![Tile::empty(); (MAP_HEIGHT * MAP_WIDTH) as usize] }
}
}
impl std::ops::Index<i32> for Level {
type Output = Tile;
fn index(&self, x: i32) -> &Self::Output {
self[MAP_WIDTH + x]; // We have x and y values; how do we make this work?
}
}
【问题讨论】:
标签: vector syntax rust operator-overloading