They're not.
fn main() { unsafe { COUNTER += 1; println!("COUNTER = {}", COUNTER); } unsafe { COUNTER += 10; println!("COUNTER = {}", COUNTER); } }
use std::sync::Mutex; static LIST: Mutex<Vec<String>> = Mutex::new(Vec::new()); fn main() -> Result<(), Box<dyn std::error::Error>> { LIST.lock()?.push("hello world".to_string()); println!("{}", LIST.lock()?[0]); Ok(()) }
reply
It doesn't increment anything for starters. The example would be more convoluted if it did the same thing.
And strings in rust always delivers the WTFs I need o na Friday:
"hello world".to_string()
use std::sync::Mutex; fn main() -> Result<(), Box<dyn std::error::Error>> { static PEDANTRY: Mutex<u64> = Mutex::new(0); *PEDANTRY.lock()? += 1; println!("{}", PEDANTRY.lock()?); Ok(()) }
And declaring a static variable inside a function, even if in main, smells.
static mut COUNTER: u32 = 0;
If on 2024 edition, you will additionally need
#![allow(static_mut_refs)]
They're not.
Global mutable variables are as easy in Rust as in any other language. Unlike other languages, Rust also provides better things that you can use instead.