Inizializzare costanti Rust durante l’esecuzione con lazy_static

Inizializzazione costanti Rust con lazy_static

Definisci variabili statiche non costanti con inizializzazione ritardata

Foto di Christian Lue su Unsplash

Non è un segreto che inizializzare costanti al momento della compilazione sia una buona pratica di programmazione. Non solo si riduce l’overhead di inizializzazione, ma si facilita anche l’ottimizzazione intelligente del codice da parte del compilatore conoscendo in anticipo il valore della costante.

Tuttavia, a volte è impossibile inizializzare ogni costante al momento della compilazione poiché richiede operazioni non costanti o il recupero di dati disponibili solo durante l’esecuzione. Ad esempio, supponiamo di utilizzare ripetutamente il numero √7 nel nostro programma. Invece di calcolarlo ogni volta, sarebbe meglio definire una costante come segue:

const ROOT_OF_SEVEN: f64 = 7_f64.sqrt();

Questo codice, tuttavia, è invalido. Il compilatore di Rust restituisce il seguente errore:

cannot call non-const fn `f64::<impl f64>::sqrt` in constantscalls in constants are limited to constant functions, tuple structs and tuple variants

Lo stesso accade se si tenta di inizializzare una costante con una variabile di ambiente:

const LANG: String = env::var("LANG").unwrap();

Dal compilatore di Rust:

cannot call non-const fn `std::env::var::<&str>` in constantscalls in constants are limited to constant functions, tuple structs and tuple variants

Come si può vedere, alcune costanti che sarebbe utile inizializzare al momento della compilazione richiedono operazioni non costanti. Qui entra in gioco la libreria lazy_static di Rust. lazy_static consente di definire variabili statiche globali che vengono inizializzate in modo ritardato, il che significa che i loro valori vengono impostati solo al primo utilizzo effettivo durante l’esecuzione. Le variabili statiche pigre hanno bisogno di essere inizializzate solo la prima volta che vengono utilizzate e, poiché questa è un’operazione che avviene una sola volta, il loro overhead di inizializzazione durante l’esecuzione è trascurabile.

In questo articolo, vedremo come utilizzare la libreria lazy_static di Rust per inizializzare in modo pigro costanti globali e alcuni dei loro casi d’uso.

Usa lazy_static

Per utilizzare la libreria lazy_static, è sufficiente aggiungerla alle dipendenze del tuo progetto mediante