rust - 有没有办法让结构包含可能不再有效的引用?
问题描述
就像某种Box
持有对价值的引用之类的东西?在读取它之前,我必须检查该值是否仍然存在,例如当 aOption
是模式匹配时。
一个模拟示例:
struct Whatever {
thing: AliveOrNot<i32>,
}
fn main() {
let mut w = Whatever { thing: Holder::Empty };
w.thing = AliveOrNot::new(100);
match w.thing {
Empty => println!("doesn't exist"),
Full(value) => println!("{}", value),
}
}
确切的情况是我正在使用 sdl2Font
并且我想将该结构的实例存储在另一个结构中。我不想做这样的事情,因为它Parent
必须活得和Font
:
struct Font<'a, 'b> {
aa: &'a i32,
bb: &'b i32,
}
struct Parent<'a, 'b, 'c> {
f: &'c Font<'a, 'b>
}
我想要的是Parent
无论该领域是否仍然存在,都可以正常工作。
解决方案
您可能感兴趣std::rc::Weak
或std::sync::Weak
:
use std::rc::{Rc, Weak};
struct Whatever {
thing: Weak<i32>,
}
impl Whatever {
fn do_it(&self) {
match self.thing.upgrade() {
Some(value) => println!("{}", value),
None => println!("doesn't exist"),
}
}
}
fn its_dead_jim() -> Whatever {
let owner = Rc::new(42);
let thing = Rc::downgrade(&owner);
let whatever = Whatever { thing };
whatever.do_it();
whatever
}
fn main() {
let whatever = its_dead_jim();
whatever.do_it();
}
42
doesn't exist
在安全的 Rust 中使用非引用无法做到这一点。'static
Rust 引用的一大特点是不可能引用无效值。
您可以泄漏内存,创建一个
&'static i32
,但如果您需要多次执行此操作,这是不可持续的。您可以使用
unsafe
代码并处理没有生命周期概念的原始指针。然后,您承担确保不引入内存不安全的责任。
也可以看看:
推荐阅读
- xml - MSXML2 丢弃编码?
- azure - Azure Devops 似乎未在同一帐户上连接到 Azure 门户
- javascript - react const中的目标片段
- facebook - Facebook 是否需要重新认证?
- jenkins - 循环中的 Jenkins 并行脚本使用错误的变量
- python - 如何重复更新 python 字典而不丢失另一个字典中的键的原始数据?
- html - 图片未显示在 GitHub 托管的网站上
- javascript - 为什么使用await&EventEmitter时nodejs程序退出?
- c# - 如何通过 CLI 更新 UWP 项目的 nuget 包?
- reactjs - Reactjs 事件/操作按钮未按预期切换