如何将String分配给可变静态变量?

Tur*_*est 4 string static rust

我想为全局变量赋值,但它一直有编译器错误:

static mut NameArr: [&'static str; 20] = ["\0"; 20];

fn main() {

  unsafe {
    static mut S1 :String = "".to_string();

    S1.push('\0');

    NameArr[0] = S1.as_slice();
  }
}
Run Code Online (Sandbox Code Playgroud)

错误:

a.rs:7:29: 7:43 error: mutable statics are not allowed to have destructors
a.rs:7     static mut S1 :String = "".to_string();
                                   ^~~~~~~~~~~~~~
a.rs:7:29: 7:43 error: static contains unimplemented expression type [E0019]
a.rs:7     static mut S1 :String = "".to_string();
                                   ^~~~~~~~~~~~~~
error: aborting due to 2 previous errors
Run Code Online (Sandbox Code Playgroud)

She*_*ter 6

不知道你要做什么,所以我不能告诉你该怎么做.

也许你想要我如何创建一个全局的,可变的单例?

话虽这么说,我可以帮助解释你的错误:

static mut NameArr: [&'static str; 20] = ["\0"; 20];
Run Code Online (Sandbox Code Playgroud)

这声明了一个可变的全局变量.该变量是一个固定长度为20个项目的数组.每个项目都是一个&'static str字符串文字,必须保证在整个程序的生命周期中存在.这'static意味着什么.

static mut S1: String = "".to_string();
Run Code Online (Sandbox Code Playgroud)

这会尝试创建另一个可变全局变量,这次它是一个String在堆中分配和拥有一块内存的对象.当String超出范围时,通过析构函数释放内存.这是您的第一个错误的来源 - 不允许全局变量具有析构函数.此外,当前不允许在定义全局值时调用方法 - 这些方法现在没有上下文运行!

拥有全局可变变量对于Rust或任何程序来说真的不是一个好主意.出于技术原因(例如数据竞争)和程序员的原因(对这种代码的合理化很难).你可以看一下如何创建一个全局的,可变的单例?如果你真的需要它的说明如何做到这一点.

unsafe由于这些原因,Rust强制您使用块来处理可变全局变量.编译器无法再保证程序的安全性.例如,如果你打电话,你在数组中存储的值会发生什么S1.clear

还有风格问题:

  1. Rust snake_case用于变量
  2. SCREAMING_SNAKE_CASE 对于常数/静力学
  3. CamelCase 结构/枚举/特征
  4. 4空间缩进
  5. 变量定义应该是name: type,后面的空格: