rust - 有没有办法让结构体包含可能不再有效的引用?

标签 rust

就像某种保存对值或其他内容的引用的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我想将该结构的实例存储在另一个结构中。我不想做这样的事情,因为 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::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

使用非'static引用在安全的Rust中没有方法可以做到这一点。 Rust 引用的一个重要点是不可能引用无效值。

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

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

另请参阅:

关于rust - 有没有办法让结构体包含可能不再有效的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60508705/

相关文章:

memory - 为什么 ?Sized 是某些 RefCell 函数的边界,但不是全部?

c - 为什么从C调用Rust库会导致内存泄漏?

rust - HashMap 中的借用和临时变量会引发循环错误

unit-testing - 为什么 `assert_eq` 和 `assert_ne` 存在,而简单的 `assert` 就足够了?

rust - 结构错误 : cannot borrow data in a "&" reference as mutable 中的 HashMap

rust - StreamExt::forward 失败,错误为 `expected integer, found enum ` std::result::Result``

unit-testing - 在单元测试中评估多个断言 - 不要在第一个失败的断言处停止

rust - 用本地版本替换 crate 依赖项时出现问题

rust - 为什么这个可变借用超出了它的范围?

for-loop - 将向量传入 `for` 循环与对向量的引用是什么意思?