c++ - 将 Cpp 转换为 Rust,处理全局静态对象

标签 c++ rust static global lazy-static

我是一名初学者,正在将熟悉的 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/

相关文章:

c# - 我可以将带有 C 风格方法的 C++ 接口(interface)导出到 C# dll 吗

c++ - QLibrary 的 resolved 函数只有一个参数?

arrays - 如何在 Rust 中创建并传递以空字符结尾的 C 字符串数组 (char**)?

function - 我可以有一个在 Rust 中不被类型化为闭包的匿名函数吗?

c++ - 将缓冲区转换为字符串 C++ boost

c++ - 在 C++ 中比较字符时是否需要遵循特殊语法?

module - 我不能在同一个文件中拥有所有特征和 impl;如何放在单独的文件中?

c++ - 在类或结构中调用静态函数的好习惯

静态 vs 函数静态 vs 成员函数静态的 C++ 内存布局

c - 静态变量忽略重新分配