就是用unsafe
在Rust In Action中给出了两段代码
use rand::{random};
   
  static mut ERROR: isize = 0;
   
  struct File;
   
  #[allow(unused_variables)]
fn read(f: &File, save_to: &mut Vec<u8>) -> usize {
      if random() && random() && random() {
         unsafe {
             ERROR = 1;
         }
     }
     0
 }
  
 #[allow(unused_mut)]
 fn main() {
     let mut f = File;
     let mut buffer = vec![];
  
     read(&f, &mut buffer);
     unsafe {
         if ERROR != 0 {
             panic!("An error has occurred!")
         }
     }
 }
第二个例子,停机标志
#![cfg(not(windows))]
extern crate libc;
use std::time;
use std::thread::{sleep};
use libc::{SIGTERM, SIGUSR1};
static mut SHUT_DOWN: bool = false;
fn main() {
    register_signal_handlers();
    let delay = time::Duration::from_secs(1);
    for i in 1_usize.. {
        println!("{}", i);
        unsafe {
            if SHUT_DOWN {
                println!("*");
                return;
            }
        }
        sleep(delay);
        let signal = if i > 2 {
            SIGTERM
        } else {
            SIGUSR1
        };
        unsafe {
            libc::raise(signal);
        }
    }
    unreachable!();
}
fn register_signal_handlers() {
    unsafe {
        libc::signal(SIGTERM, handle_sigterm as usize);
        libc::signal(SIGUSR1, handle_sigusr1 as usize);
    }
}
#[allow(dead_code)]
fn handle_sigterm(_signal: i32) {
    register_signal_handlers();
    println!("SIGTERM");
    unsafe {
        SHUT_DOWN = true;
    }
}
#[allow(dead_code)]
fn handle_sigusr1(_signal: i32) {
    register_signal_handlers();
    println!("SIGUSR1");
}
如果不想用 unsafe代码,可以用 lazy_static! 宏
use lazy_static::lazy_static; 
use regex::Regex; 
lazy_static! {
    static ref RE: Regex = Regex::new(r"hello (\w+)!").unwrap();
}
fn main() {
    let text = "hello bob!\nhello sue!\nhello world!\n";
    for cap in RE.captures_iter(text) {
        println!("your name is: {}", &cap[1]);
    }
}
如果这个全局变量可变, 还需要加上Mutex(单个修改者)或者RwLock(多个修改者)
另外一个方法是 https://github.com/matklad/once_cell 据说正在提议加入std库中