一、全局變量用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更傾向於使用模塊級別的數據。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/237338.html