2016-09-12 57 views
5

Co jest nie tak z tym kodem?const fns są niestabilną funkcją podczas korzystania z AtomicUsize :: new

use std::sync::atomic::AtomicUsize; 

static mut counter: AtomicUsize = AtomicUsize::new(0); 

fn main() {} 

otrzymuję ten błąd:

error: const fns are an unstable feature 
--> src/main.rs:3:35 
    |> 
3 |> static mut counter: AtomicUsize = AtomicUsize::new(0); 
    |>         ^^^^^^^^^^^^^^^^^^^ 
help: in Nightly builds, add `#![feature(const_fn)]` to the crate attributes to enable 

Docs wspomnieć, że inne atomowe int rozmiary są niestabilne, ale AtomicUsize jest pozornie stabilny.

Celem tego jest uzyskanie atomowego licznika na proces.

+3

Atomowy nie musi i nie powinien być w "statycznej mutacji", powinien być w zwykłym 'statycznym'. Operacje atomowe wykorzystują zmienność wewnętrzną podczas ich modyfikowania. Widzisz, że wszystkie ich mutujące metody używają '& self' jako pierwszego argumentu (dzielonego odniesienia). – bluss

+1

Ach, tak, to ma sens, ponieważ nie muszą polegać na kontrolerze pożyczek. – Timmmm

Odpowiedz

9

Tak, nie można wywoływać funkcji poza funkcją od rdzy 1.10. Wymaga to funkcji, która nie jest jeszcze stabilna: stała ocena funkcji.

można zainicjować zmienną atomowej do zera przy użyciu ATOMIC_USIZE_INIT (lub odpowiedniego wariantu):

use std::sync::atomic::{AtomicUsize, ATOMIC_USIZE_INIT}; 

static COUNTER: AtomicUsize = ATOMIC_USIZE_INIT; 

fn main() {} 

Jak bluss points out, nie ma potrzeby, aby ten zmienny. I jak wskazuje kompilator, wartości powinny być w SCREAMING_SNAKE_CASE.