一、全局变量用static定义
Rust中定义全局变量需要使用static关键字,这使得它们在内存中始终存在,而不是像局部变量那样在作用域结束后会被销毁。
下面是一个例子,它定义了一个全局变量message。
static mut message: &str = "Hello, World!";
// 这里unsafe关键字是必需的,因为这个变量可能被不同的线程同时访问
fn main() {
println!("{}", unsafe { message });
unsafe {
message = "Goodbye, World!";
}
println!("{}", unsafe { message });
}
需要注意的是,由于全局变量的生命周期是整个程序的运行时间,所以我们需要确保对它的访问是线程安全的。上面的例子使用了unsafe关键字来表明这一点,并且需要注意该变量的值是可变的(&mut),因此可以在程序中改变它的值。
二、Rust全局变量的作用域
在Rust中,一个模块中定义的全局变量只能在该模块中使用。我们可以使用pub关键字将其公开(也就是说,其它模块可以使用这个变量)。
下面是一个例子:
mod my_module {
pub static message: &str = "Hello, World!";
}
fn main() {
println!("{}", my_module::message);
}
在这个例子中,我们在一个名为my_module的模块中定义了一个全局变量message,并将其公开。这使得我们可以通过my_module::message来访问它。
三、Rust全局变量的初始化
Rust要求全局变量的初始值必须是编译时常量。编译时常量是指在编译过程中已知的、不能改变的值,例如一个整数或一个字符串字面量。这意味着我们不能像在C或C++中那样,在程序运行时从用户输入或文件中读取初始值。
以下是一个有效的例子:
const PI: f64 = 3.14159;
fn main() {
println!("{}", PI);
}
然而,以下代码将不会编译:
static mut message: &str = String::from("Hello, World!");
fn main() {
println!("{}", unsafe { message });
}
这是因为String::from("Hello, World!")不是一个编译时常量,所以不能用作全局变量的初始值。
四、全局变量的命名规范
与局部变量一样,在Rust中,全局变量的命名应该使用snake_case风格。此外,在Rust中,全局变量的名字通常使用大写字母、下划线和数字构成,如SECONDS_PER_MINUTE。
下面是一个例子:
static mut MAX_THREADS: u32 = 10;
fn main() {
unsafe {
println!("{}", MAX_THREADS);
}
}
五、全局变量的生命周期
全局变量在整个程序运行期间都是有效的,因此在访问全局变量时需要注意生命周期问题。如果一个全局变量是可变的,则需要使用unsafe代码块来访问它。
下面是一个例子:
static mut message: &str = "Hello, World!";
fn main() {
// 全局变量的生命周期与程序相同,需要使用unsafe关键字来标记该变量是不安全的
unsafe {
println!("{}", message);
message = "Goodbye, World!";
println!("{}", message);
}
}
需要注意的是,Rust中的全局变量并不像在C或C++中那样常见,因为Rust更倾向于使用模块级别的数据。