G.CNS.01 常量类型不应具有内部可变性
【级别】 要求
【描述】
内部可变性类型包括: atomics
, Cell
, RefCell
, UnsafeCell
, Mutex
, RwLock
, OnceLock
等,对 const
变量的修改是无效的,有可能跟程序语义预期结果不符
【说明】
所有 atomics 类型可参考: https://doc.rust-lang.org/std/sync/atomic/index.html#structs
【反例】
Rust
use std::sync::atomic::{AtomicUsize, Ordering::SeqCst};
// 不符合
const CONST_ATOM: AtomicUsize = AtomicUsize::new(12);
CONST_ATOM.store(6, SeqCst); // 对 const 变量值修改实际是无效的
assert_eq!(CONST_ATOM.load(SeqCst), 12); // 仍为 12
【反例】
Rust
use core::cell::Cell;
// 不符合
const VAL: Cell<i32> = Cell::new(100);
VAL.set(1);
assert_eq!(VAL.get(), 100); // 仍为原来的数值 100
【反例】
Rust
use std::sync::Mutex;
use std::sync::RwLock;
use std::sync::OnceLock;
// 不符合
const M: Mutex<u8> = Mutex::new(5);
const R: RwLock<u8> = RwLock::new(5);
const O: OnceLock<u8> = OnceLock::new();
fn main() {
*M.lock().unwrap() = 10; println!("{:?}", M);
*R.write().unwrap() = 10; println!("{:?}", R);
O.set(10).unwrap();
println!("{:?}", O);
}