我试图包装一个向量来改变它的索引行为,这样当发生越界访问时,它不会惊慌,而是返回对虚拟值的引用,如下所示:
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 {
&()
}
}
}
Run Code Online (Sandbox Code Playgroud)
这对于 Index 的实现来说效果很好,但是尝试以同样的方式实现 IndexMut 会因为明显的原因而失败。我的集合中的类型没有 Drop 实现,因此不需要调用析构函数(除了释放内存)。
我能想到的唯一解决方案是拥有一个包含数千个虚拟对象的静态可变数组,并分发对此数组元素的引用,这是一个可怕的解决方案,尽管如果借用的虚拟对象数量超过了大小,它仍然会导致 UB静态数组。
rust ×1