在Rust中,有没有一种方法可以将“有效性检查”附加到返回的可变引用上?

u3r8eeie  于 2024-01-08  发布在  其他
关注(0)|答案(1)|浏览(137)

我正在定义一个Map结构:

  1. struct Point { x: isize, y: isize };
  2. enum MapItem { Pipe, Ground, Start };
  3. struct Map {
  4. map: Vec<Vec<MapItem>>>,
  5. start: Option<Point>,
  6. }

字符串
我已经在Map上实现了IndexIndexMut以支持Map[Point]操作。但是,该Map对Start Map项有约束:

  • 在Map中只能定义一个StartMap项。
  • 当Map项目从任何其他项目更改为Start时,map.start字段将设置为Some(location)
  • 当Map项目从Start更改为其他任何项目时,map.start字段将设置为None

我不知道在实现IndexMut时如何维护这些约束。有没有办法向IndexMut返回的&mut MapItem添加一个有效性约束,或者我必须删除IndexMut实现,而只是向Map的基本实现添加一个set(location, item)方法?

63lcw9qa

63lcw9qa1#

通过跳过许多内部可变性的环节,你就可以做到这一点。这需要大量的代码,仅仅是为了能够编写mymap[mypoint] = ...而不是mymap.set_point(...)--很可能不值得这么麻烦。
问题是std::ops::IndexMutstd::ops::Index共享它的Output-type,而std::ops::IndexMut::index_mut()被定义为返回&mut Self::Output.由于您必须从IndexMut返回一个可变引用,您实际上无法返回一些在事件发生后执行强制的代理对象-无法观察在您发出&mut之后发生了什么-参考

相关问题