rust - 在 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
,但无论如何——在某些情况下你必须解除引用,有没有比我的方法更干净的方法如上所述?还是故意让程序员不去做这件事变得笨拙?
解决方案
推荐阅读
- php - symfony防火墙下的PDF文件
- c# - C# 组合框项目选择在第一次尝试时为空
- clion - 用于 CLion 的类似 vim 的 quickfix 插件
- javascript - 在没有数据库的服务器上存储数据
- r - 如何从图形中获取值?
- c++ - 如何将两个字符串加在一起,就好像它们是变量一样?
- node.js - 为什么 AWS S3 返回错误消息访问被拒绝?
- javascript - JavaScript中命名空间的理解
- angular - 如何配置角度项目 tsconfig 路径 [] 而不会出现 linting 错误?
- python - 在 tk.Entry 文本变量上调用 tk.StringVar.set() 会导致 validate="focusout" 停止被调用