如何声明一个静态的向量数组?



如何在Rust 中声明可变大小数组(向量)的静态/常量数组?在C++中,您可以执行以下操作:

static const std::vector<std::string> MY_STRINGS[] = {
{ "hi" },
{ "hello", "world" },
{ "salutations", "watery", "globe" }
};

事情会按您的预期工作(数组是在应用程序启动 AFAIK 期间构造的)。Rust 中的等效代码是什么?似乎编译器正在尽最大努力阻止我这样做。

根据需要使用once_cell::Lazysyncunsync变体:

const MY_STR: Lazy<[Vec<&str>; 2]> =
Lazy::new(|| [vec!["hi"], vec!["hello", "world"]]);

操场

它仍然在夜间,但此功能将在某个时候稳定。std::lazy::Lazystd::lazy::SyncLazy.

如果您每晚都在,则可以使用LazyLock.喜欢这个:

#![feature(once_cell)]   // 1.65.0-nightly
use std::sync::LazyLock;
const MY_STRINGS: LazyLock<[Vec<&str>; 3]> =
LazyLock::new(|| [
vec!["hi"], 
vec!["hello", "world"],
vec!["salutations", "watery", "globe"]
]);
fn main() {
println!("{}, {}", MY_STRINGS[1][0], MY_STRINGS[2][2]);
}

LazyLock或多或少地做了板条箱once_cell和lazy_sync做的事情。这两个板条箱很常见,所以它们很有可能已经在你的Cargo.lock依赖树中了。但是,如果您更喜欢"冒险"并随LazyLock,请做好准备,它(就像每晚的所有内容一样)在稳定之前可能会发生变化。

(注意:直到最近,std::sync::LazyLock曾经被命名为std::lazy::SyncLazy,但最近被重命名。

目前你不能有带有析构函数的 'const' 项,所以不允许Vec

如果你在编译时知道"vec"的大小,你可以使用一个数组:

const MY_STRS: [&'static str; 3] = [
"first",
"second",
"third"
];

否则,我建议看看lazy_static箱:https://crates.io/crates/lazy_static

这使您可以编写如下所示的内容:

lazy_static! {
static ref MY_STRS: Vec<String> = {
let mut strings = vec![];
strings.push("hello".to_string());
strings
}
}

顾名思义,它的行为是延迟初始化的。

我建议阅读此板条箱的文档以了解线程安全的含义

相关内容

  • 没有找到相关文章

最新更新