是否有一种方法可以使结构包含可能不再有效的引用?

问题描述 投票:2回答:1

像某种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> } 起作用,而不管该字段是否仍然有效。

rust
1个回答
2
投票

您可能对Parentstd::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 代码并处理没有生命周期概念的原始指针。然后,您将承担确保不会引起内存不安全的责任。

另请参见:

© www.soinside.com 2019 - 2024. All rights reserved.