我正在尝试包装一个向量来更改其索引行为,这样当发生越界访问时,它将返回对虚拟值的引用,而不是触发错误。
use std::ops::Index;
struct VecWrapper(Vec<()>);
impl Index<usize> for VecWrapper {
type Output = ();
fn index(&self, idx: usize) -> &() {
if idx < self.0.len() {
&self.0[idx]
} else {
&()
}
}
}
这对于Index的实现来说完全没问题,但是用同样的方式实现IndexMut会因为显而易见的原因失败。我的集合类型没有Drop实现,因此不需要调用析构函数(除了释放内存)。
我能想到的唯一解决方案是拥有一个包含数千个虚拟元素的静态可变数组,并分配对该数组元素的引用,但这仍然是一个可怕的解决方案,如果借用的虚拟元素数量超过静态数组的大小,它仍然会导致UB。
.get
而不是索引你的原始向量?这更符合惯用法,减少了样板代码,并且每个人都能理解阅读你的代码。 - jthulhu()
是真正的类型吗? - Chayim Friedman[]
运算符。 - Chayim Friedman