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永远不会被取消分配,并可能导致内存泄漏。