我正在定义一个地图结构:
struct Point { x: isize, y: isize };
enum MapItem { Pipe, Ground, Start };
struct Map {
map: Vec<Vec<MapItem>>>,
start: Option<Point>,
}
我在地图上实现了
Index
和IndexMut
来支持Map[Point]
操作。
但是,地图对 Start
地图项有限制:
Start
地图项。Start
时,map.start
字段将设置为 Some(location)
。Start
更改为其他任何内容时,map.start
字段将设置为 None
。我不知道如何在实施时保持这些约束
IndexMut
。有没有办法向 IndexMut 返回的 &mut MapItem
添加有效性约束,或者我是否必须删除 IndexMut 实现并仅向 Map 的基本实现添加 set(location, item)
方法?
通过跳过许多内部可变性的障碍,你可以做到这一点。这需要大量代码,只是为了能够编写
mymap[mypoint] = ...
而不是 mymap.set_point(...)
- 很可能不值得这么麻烦。
问题在于
std::ops::IndexMut
与 Output
共享 std::ops::Index
类型,并且 std::ops::IndexMut::index_mut()
被定义为返回 &mut Self::Output
。由于您有从IndexMut
返回可变引用,因此您实际上无法返回一些在事后执行强制操作的代理对象 - 无法观察在您发出该&mut
之后发生了什么-参考。