首页 > 解决方案 > 有没有办法让结构包含可能不再有效的引用?

问题描述

就像某种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无论该领域是否仍然存在,都可以正常工作。

标签: rust

解决方案


您可能感兴趣std::rc::Weakstd::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 中使用非引用无法做到这一点。'staticRust 引用的一大特点是不可能引用无效值。

  • 您可以泄漏内存,创建一个&'static i32,但如果您需要多次执行此操作,这是不可持续的。

  • 您可以使用unsafe代码并处理没有生命周期概念的原始指针。然后,您承担确保不引入内存不安全的责任。

也可以看看:


推荐阅读