如何创建一次性可变引用?
how can I create a throwaway mutable reference?
我正在尝试包装一个向量来改变它的索引行为,这样当发生越界访问时,而不是恐慌它returns一个对虚拟值的引用,就像这样:
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借用静态数组的大小。
为包装器提供一个附加字段,即虚拟字段。它具有相同的生命周期限制,因此不能使用别名。
我正在尝试包装一个向量来改变它的索引行为,这样当发生越界访问时,而不是恐慌它returns一个对虚拟值的引用,就像这样:
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借用静态数组的大小。
为包装器提供一个附加字段,即虚拟字段。它具有相同的生命周期限制,因此不能使用别名。