在Rust中解除绑定参考的最惯用的方法是什么?

时间:2019-08-01 21:13:36

标签: rust

我需要将多个可变引用返回到数据结构的不同元素。因为编译器无法检查引用没有别名的逻辑,所以我必须使用不安全的代码来解除引用的绑定,以便可以将它们强制转换为正确的返回生存期。

到目前为止,我发现的最佳解决方案是在unsafe块中:

  • 将引用投射到原始指针
  • 取消引用指针,并立即对结果进行可变引用。
struct Node<T> {
    item: T,
    next: NodeRef<T>,
}


type NodeRef<T> = Option<Box<Node<T>>>;

pub struct ListIterMut<'a, T> {
    cur: &'a mut NodeRef<T>
}

impl<'a, T> Iterator for ListIterMut<'a, T> {
    type Item = &'a mut T;

    fn next(&mut self) -> Option<Self::Item> {
        let cur = unsafe {&mut *(self.cur as *mut NodeRef<T>)}; // Super ugly!
        cur.as_mut().map(|node| {
            self.cur = &mut node.next;
            &mut node.item
        })
    }
}

已向我展示了解决此问题的更正确方法,根本不需要unsafe,但是无论如何-在某些情况下您必须取消引用的约束,是否有更清洁的方法比我上面描述的方法更有效吗?还是故意使笨拙以阻止程序员这样做呢?

0 个答案:

没有答案