首页 > 解决方案 > 在 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,但无论如何——在某些情况下你必须解除引用,有没有比我的方法更干净的方法如上所述?还是故意让程序员不去做这件事变得笨拙?

标签: rust

解决方案


推荐阅读