我想为全局变量赋值,但它一直存在编译器错误:
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
答案 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
,那么您在数组中存储的值会发生什么变化?
还有风格问题:
snake_case
表示变量SCREAMING_SNAKE_CASE
for constants / statics CamelCase
用于结构/枚举/特征name: type
,:
答案 1 :(得分:0)
在Rust中,您可以使用{{3}}和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);
}
}