متغیرهای ثابت قابل تغییر

خواندن یک متغیر استاتیک تغییرناپذیر بی‌خطر است:

static HELLO_WORLD: &str = "سلام دنیا!";

fn main() {
    println!("HELLO_WORLD: {HELLO_WORLD}");
}

با‌این‌حال، از آنجایی که شرایط رقابتی داده‌ها ممکن است رخ دهد، خواندن و نوشتن متغیرهای mutable static ناامن است:

static mut COUNTER: u32 = 0;

fn add_to_counter(inc: u32) {
    // SAFETY: There are no other threads which could be accessing `COUNTER`.
    unsafe {
        COUNTER += inc;
    }
}

fn main() {
    add_to_counter(42);

    // SAFETY: There are no other threads which could be accessing `COUNTER`.
    unsafe {
        println!("COUNTER: {COUNTER}");
    }
}
This slide should take about 5 minutes.
  • برنامه در اینجا امن است زیرا single-thread است. با این حال، کامپایلر Rust محافظه کار است و بدترین‌ها را در نظر می‌گیرد. unsafe را حذف کنید و ببینید چگونه کامپایلر توضیح می‌دهد که جهش یک static از چندین thread یک رفتار تعریف نشده است.

  • استفاده از یک static قابل تغییر (mutable) به طور کلی ایده بدی است، اما مواردی وجود دارد که ممکن است در کدهای سطح پایین no_std منطقی باشد، مانند اجرای یک heap allocator یا کار با برخی از APIهای مربوط به زبان C.