我需要将多个可变引用返回到数据结构的不同元素。因为编译器无法检查引用没有别名的逻辑,所以我必须使用不安全的代码来解除引用的绑定,以便可以将它们强制转换为正确的返回生存期。
到目前为止,我发现的最佳解决方案是在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
,但是无论如何-在某些情况下您必须取消引用的约束,是否有更清洁的方法比我上面描述的方法更有效吗?还是故意使笨拙以阻止程序员这样做呢?