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

时间:2015-04-15 15:49:39

标签: 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

2 个答案:

答案 0 :(得分:6)

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

也许您想要How do I create a global, mutable singleton?

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

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

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

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

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

拥有全局可变变量对于Rust或任何程序来说真的不是一个好主意。出于技术原因(例如数据竞争)和程序员的原因(对这类代码进行合理化是 hard )。如果确实需要,可以查看How do I create a global, mutable singleton?有关如何操作的说明。

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

还有风格问题:

  1. Rust使用snake_case表示变量
  2. SCREAMING_SNAKE_CASE for constants / statics
  3. CamelCase用于结构/枚举/特征
  4. 4空间缩进
  5. 变量定义应为name: type:
  6. 后面的空格

答案 1 :(得分:0)

在Rust中,您可以使用{{3}}和RwLockMutex来同步写入权限。

<强> Cargo.toml

[dependencies]
lazy_static = "0.2"

<强> main.rs

#[macro_use]
extern crate lazy_static;

use std::sync::RwLock;

lazy_static! {
    static ref GLOBAL_STRING: RwLock<String> = RwLock::new("string".to_string());
}

fn main() {
    {
        let nice = GLOBAL_STRING.read().unwrap();
        println!("{}", *nice);
    }

    {
        let mut mystr = GLOBAL_STRING.write().unwrap();
        *mystr = "assign new".to_string();
    }

    {
        let nice = GLOBAL_STRING.read().unwrap();
        println!("{}", *nice);
    }
}