Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何将字符串分配给可变静态变量?_String_Static_Rust - Fatal编程技术网

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

String 如何将字符串分配给可变静态变量?,string,static,rust,String,Static,Rust,我想给全局变量赋值,但它一直有编译器错误: static mut NameArr:[&'static str;20]=[“\0;20]; fn main(){ 不安全{ 静态mut S1:String=”“.to_String(); S1.推送('\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 NameArr:[&'static str;20]=[“\0;20];
fn main(){
不安全{
静态mut S1:String=”“.to_String();
S1.推送('\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 mut S1: String = "".to_string();
这将尝试创建另一个可变全局变量,这次它是一个
字符串
,一个在堆中分配并拥有一段内存的对象。当
字符串
超出范围时,通过析构函数释放内存。这是第一个错误的来源-全局变量不允许有析构函数。此外,当前不允许在定义全局值时调用方法-现在没有上下文让这些方法运行

对于Rust或任何程序来说,拥有全局可变变量都不是一个好主意。有技术原因(如数据竞争)和程序员原因(对此类代码进行合理化是困难的)。如果你真的需要的话,你可以查看关于如何做的说明

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

还有一些风格上的问题:

  • Rust对变量使用
    snake\u case
  • SNAKE\u案例
    用于常量/静态
  • CamelCase
    用于结构/枚举/特征
  • 4-空间缩进
  • 变量定义应为
    name:type
    ,在
    后面加空格:
  • 在Rust中,您将使用和
    RwLock
    Mutex
    来同步写入访问

    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);
        }
    }
    
    #[宏使用]
    外部板条箱(静态);
    使用std::sync::RwLock;
    懒惰的人!{
    静态引用全局_字符串:RwLock=RwLock::new(“STRING.to_STRING());
    }
    fn main(){
    {
    让nice=GLOBAL_STRING.read().unwrap();
    println!(“{}”,*nice);
    }
    {
    让mut mystr=GLOBAL_STRING.write().unwrap();
    *mystr=“assign new.”to_string();
    }
    {
    让nice=GLOBAL_STRING.read().unwrap();
    println!(“{}”,*nice);
    }
    }
    
    为什么要有一个全局可变变量?这强烈地阻碍了Rust想要鼓励的一切。基本上你的整个程序都必须使用
    不安全的
    ,这一事实表明你真的想做一些尴尬的事情。你到底想做什么(与如何做不同)?从您的代码示例中我一点也不清楚。为什么您有全局
    &的静态str
    和应用程序生命周期?If永远不会被取消分配,并可能导致内存泄漏。