gpt4 book ai didi

static - 如何在 Rust 库中运行清理代码?

转载 作者:行者123 更新时间:2023-12-03 11:48:07 26 4
gpt4 key购买 nike

我正在制作一个跨平台终端库。因为我的库更改了终端的状态,所以我需要在进程结束时恢复对终端所做的所有更改。我现在正在实现这个功能,并在思考如何在最后恢复到原始终端状态。

我认为在程序启动时会初始化一个静态变量,而当程序结束时,这个静态变量将被销毁。因为我的静态变量是一个结构,它实现了 Drop trait,它会在程序结束时被删除,但情况并非如此,因为字符串“drop called”从未打印过:

static mut SOME_STATIC_VARIABLE: SomeStruct = SomeStruct { some_value: None };

struct SomeStruct {
pub some_value: Option<i32>,
}

impl Drop for SomeStruct {
fn drop(&mut self) {
println!("drop called");
}
}

为什么是 drop()程序结束时没有调用?我的想法是错误的吗?我应该以另一种方式来做吗?

最佳答案

在库中强制执行初始化和清理代码的一种方法是引入 Context只能用公共(public) new() 构造的类型函数,并实现 Drop特征。库中需要初始化的每个函数都可以使用 Context作为参数,因此用户需要在调用这些函数之前创建一个。任何清理代码都可以包含在 Context::drop() 中.

pub struct Context {
// private field to enforce use of Context::new()
some_value: Option<i32>,
}

impl Context {
pub fn new() -> Context {
// Add initialization code here.
Context { some_value: Some(42) }
}
}

impl Drop for Context {
fn drop(&mut self) {
// Add cleanup code here
println!("Context dropped");
}
}

// The type system will statically enforce that the initialization
// code in Context::new() is called before this function, and the
// cleanup code in drop() when the context goes out of scope.
pub fn some_function(_ctx: &Context, some_arg: i32) {
println!("some_function called with argument {}", some_arg);
}

关于static - 如何在 Rust 库中运行清理代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63058090/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com