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();
  }
}
错误:
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
我不知道你要做什么,所以我不能告诉你该怎么做.
也许你想要我如何创建一个全局的,可变的单例?
话虽这么说,我可以帮助解释你的错误:
static mut NameArr: [&'static str; 20] = ["\0"; 20];
这声明了一个可变的全局变量.该变量是一个固定长度为20个项目的数组.每个项目都是一个&'static str字符串文字,必须保证在整个程序的生命周期中存在.这'static意味着什么.
static mut S1: String = "".to_string();
这会尝试创建另一个可变全局变量,这次它是一个String在堆中分配和拥有一块内存的对象.当String超出范围时,通过析构函数释放内存.这是您的第一个错误的来源 - 不允许全局变量具有析构函数.此外,当前不允许在定义全局值时调用方法 - 这些方法现在没有上下文运行!
拥有全局可变变量对于Rust或任何程序来说真的不是一个好主意.出于技术原因(例如数据竞争)和程序员的原因(对这种代码的合理化很难).你可以看一下如何创建一个全局的,可变的单例?如果你真的需要它的说明如何做到这一点.
unsafe由于这些原因,Rust强制您使用块来处理可变全局变量.编译器无法再保证程序的安全性.例如,如果你打电话,你在数组中存储的值会发生什么S1.clear?
还有风格问题:
snake_case用于变量SCREAMING_SNAKE_CASE 对于常数/静力学CamelCase 结构/枚举/特征name: type,后面的空格: