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

问题描述 投票:0回答:1

我正在定义一个地图结构:

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)
方法?

rust constraints mutable-reference
1个回答
0
投票

通过跳过许多内部可变性的障碍,你可以做到这一点。这需要大量代码,只是为了能够编写

mymap[mypoint] = ...
而不是
mymap.set_point(...)
- 很可能不值得这么麻烦。

问题在于

std::ops::IndexMut
Output
共享
std::ops::Index
类型,并且
std::ops::IndexMut::index_mut()
被定义为返回
&mut Self::Output
。由于您
IndexMut
返回可变引用,因此您实际上无法返回一些在事后执行强制操作的代理对象 - 无法观察在您发出该
&mut
之后发生了什么-参考。

© www.soinside.com 2019 - 2024. All rights reserved.