在 Rust 中声明 Vec 并具有“静态生存期失败”

Declaring Vec in Rust with 'static lifetime fails

提问人:user52366 提问时间:11/9/2023 更新时间:11/10/2023 访问量:85

问:

我正在学习 Rust(具有 C++ 背景),并且正在努力声明具有静态生存期的向量。

基本上,我试过了......

let v : 'static Vec<u16> = vec![1, 2, 3];

...但得到lifetime in trait object type must be followed by+``

我想我的语法不正确,但找不到问题所在。

蚀寿命

评论

2赞 Chayim Friedman 11/9/2023
你希望 to 是什么意思? 总是 .'staticVec<u16>'static
0赞 user52366 11/9/2023
好的,我明白了。但是同样的问题也发生在let mut v : 'static Vec<u16> = Vec::new();
0赞 Chayim Friedman 11/9/2023
对,没关系。您需要删除 .mut'static
1赞 user52366 11/9/2023
好的,我明白了。我想我的意图是这样的:因此,如果我理解正确的话,我示例中的“静态”是一个要求,而不是实际上将生命周期设置为静态的语法部分。static mut v : Vec<u16> = Vec::new();
1赞 Jmb 11/10/2023
@user52366这很难说,因为在您的示例中是无效的语法,因此它没有任何意义。然而,关于 Rust 生命周期需要记住的重要一点是,它们是声明性的,而不是规范性的。IOW 生存期指定代码的行为方式,编译器将检查代码的行为方式是否与指定的生存期一致。但生存期无法改变代码的行为方式。'static

答:

0赞 user4815162342 11/10/2023 #1

您可能希望使用 lazy_static crate,并将您的向量声明为:

lazy_static {
    ref V: Vec<u16> = vec![1, 2, 3];
}

它既适用于函数内部,也适用于顶层,并且最接近于 C++ 在函数内部。与 C++ 不同,向量是不可变的,因此您可能希望将其包装在 或 .static std::vector<short> v = ...MutexRwLock

评论

1赞 Cerberus 11/10/2023
如今,建议使用 once_cell(或标准 OnceCell/OnceLock),因为它通常比基于宏的解决方案更不容易出错。
0赞 user4815162342 11/10/2023
@Cerberus谢谢 - 我知道两者,但在这种情况下,因为它与C++相似。目前的情况有点令人沮丧,因为两者都计划弃用以支持 std 解决方案,但遗憾的是(std 的变体)仍然不稳定。这种省略使两个外部板条箱更加符合人体工程学,特别是对于初学者。lazy_staticstaticonce_celllazy_staticLazyLockOnceLock