Переменная
A static
гарантированно имеет один экземпляр, и вы можете ссылаться на него.Переменная const
не имеет этой гарантии, и компилятору разрешено иметь ноль, один или несколько ее экземпляров.
В вашем случае код эквивалентен:
println!("{}", AtomicUsize::new(0).load(Ordering::SeqCst));
println!("{}", AtomicUsize::new(0).fetch_add(10, Ordering::SeqCst));
println!("{}", AtomicUsize::new(0).load(Ordering::SeqCst));
Поскольку каждое значение создается и выбрасывается, никакие изменения от одного к другому не распространяются.
В некотором смысле переменную const
можно представить себе как C или C ++ #define
- концептуальнозначение просто вставляется везде, где оно используется.
Clippy 0.0.211 имеет в этом случае пух :
error: a const item should never be interior mutable
--> src/main.rs:3:1
|
3 | const SOME_VAR: AtomicUsize = AtomicUsize::new(0);
| -----^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| |
| help: make this a static item: `static`
|
= note: #[deny(declare_interior_mutable_const)] on by default
= help: for further information visit https://rust-lang-nursery.github.io/rust-clippy/v0.0.211/index.html#declare_interior_mutable_const
error: a const item with interior mutability should not be borrowed
--> src/main.rs:6:20
|
6 | println!("{}", SOME_VAR.load(Ordering::SeqCst));
| ^^^^^^^^
|
= note: #[deny(borrow_interior_mutable_const)] on by default
= help: assign this const to a local or static variable, and use the variable here
= help: for further information visit https://rust-lang-nursery.github.io/rust-clippy/v0.0.211/index.html#borrow_interior_mutable_const
В Java я могу использоватьfinal HashMap
Да, вы можете очень легко HashMap
сделать в Java *1024*.Rust не хочет упрощать создание кода, который может привести к небезопасной памяти.Вам необходимо защитить тип с соответствующей безопасностью, например, Mutex
, или вам нужно углубиться в unsafe
код, если вы программист гарантируете, что глобальное значение будет когда-либо использоваться только однимthread.
См. также: