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