如何在Rust 中声明可变大小数组(向量)的静态/常量数组?在C++中,您可以执行以下操作:
static const std::vector<std::string> MY_STRINGS[] = {
{ "hi" },
{ "hello", "world" },
{ "salutations", "watery", "globe" }
};
事情会按您的预期工作(数组是在应用程序启动 AFAIK 期间构造的)。Rust 中的等效代码是什么?似乎编译器正在尽最大努力阻止我这样做。
根据需要使用once_cell::Lazy
sync
或unsync
变体:
const MY_STR: Lazy<[Vec<&str>; 2]> =
Lazy::new(|| [vec!["hi"], vec!["hello", "world"]]);
操场
它仍然在夜间,但此功能将在某个时候稳定。std::lazy::Lazy
和std::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
}
}
顾名思义,它的行为是延迟初始化的。
我建议阅读此板条箱的文档以了解线程安全的含义