像某种Box
一样拥有对值的引用或其他内容?我必须在读取值之前检查该值是否仍然有效,例如Option
与模式匹配时。
一个模拟示例:
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),
}
}
确切的情况是我正在使用sdl2 Font
,并且我想将该结构的实例存储在另一个结构中。我不想做这样的事情,因为Font
的寿命必须与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::rc::Weak
std::sync::Weak
有no方式可以使用非std::sync::Weak
引用在安全Rust中执行此操作。 Rust引用的一个重要之处在于,不可能引用无效值。
您可能会泄漏内存,从而创建一个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
代码并处理没有生命周期概念的原始指针。然后,您将承担确保不会引起内存不安全的责任。
另请参见:
'static
&'static i32
unsafe