我是一名初学者,正在将熟悉的 Cpp 项目转换为 Rust。该项目包含一个名为 Globals 的类,它存储全局配置参数。以下是其 cpp 文件的摘录:
static Globals &__get()
{
static Globals globals;
return globals;
}
const Globals &Globals::get()
{
auto &globals = __get();
if (!globals.initialized) {
throw std::runtime_error("Initialize globals first");
}
return globals;
}
void Globals::set(const Globals &globals)
{
__get() = globals;
}
我如何将其翻译为 Rust?据我所知 __get() 实现了某种单例逻辑。我读过有关lazy_static crate来实现类似的东西,但是每次我想读取它的值时解锁变量似乎太冗长了。是不是可以在cpp代码中使用像Globals::get()这样的接口(interface)来实现这一点。
我很少发帖,所以如果我忘记了什么,请告诉我,我会提供详细信息。谢谢!
最佳答案
I've read about the lazy_static crate to achieve something similar, but unlocking the variable each time I want to read its value seems to be too verbose.
有充分的理由:“安全使用rust ”包括所谓的线程安全设计。不 protected 可变全局非常不安全。
这就是为什么与可变静态交互需要不安全
(无论是读还是写)。
C++ 的翻译非常简单[0],可以很容易地从 the reference section on statics 推断出来。 ,唯一真正的区别是 Rust 静态必须被初始化。
另请注意,如果您不需要突变,则可以使用lazy_static!只读值(您根本不需要互斥体),并且不需要解锁任何内容。
[0] 虽然通过消除不必要的 __get
关于c++ - 将 Cpp 转换为 Rust,处理全局静态对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64370166/