Variáveis Estáticas e Constantes
Variáveis estáticas e constantes são duas maneiras diferentes de criar valores com escopo global que não podem ser movidos ou realocados durante a execução do programa.
const
Constantes são avaliadas em tempo de compilação e seus valores são incorporados onde quer que sejam usados:
const TAMANHO_RESUMO: usize = 3; const ZERO: Option<u8> = Some(42); fn computar_resumo(texto: &str) -> [u8; TAMANHO_RESUMO] { let mut resumo = [ZERO.unwrap_or(0); TAMANHO_RESUMO]; for (idx, &b) in texto.as_bytes().iter().enumerate() { resumo[idx % TAMANHO_RESUMO] = resumo[idx % TAMANHO_RESUMO].wrapping_add(b); } resumo } fn main() { let resumo = computar_resumo("Olá"); println!("Resumo: {resumo:?}"); }
De acordo com o Rust RFC Book, eles são expandidos no próprio local (inline) quando utilizados.
Somente funções marcadas como const podem ser chamadas em tempo de compilação para gerar valores const. As funções const podem, entretanto, ser chamadas em tempo de execução.
static
Variáveis estáticas permanecerão válidas durante toda a execução do programa e, portanto, não serão movidas:
static BANNER: &str = "Bem-vindo ao RustOS 3.14"; fn main() { println!("{BANNER}"); }
Conforme observado no Rust RFC Book, eles não são expandidos no local (inlined) quando utilizados e possuem um local de memória real associado. Isso é útil para código inseguro (unsafe) e embarcado, e a variável é válida durante toda a execução do programa. Quando um valor de escopo global não tem uma razão para precisar de identidade de objeto, geralmente const é preferido.
Como variáveis estáticas (static) são acessíveis de qualquer thread, elas precisam ser Sync. A mutabilidade interior é possível através de um Mutex, atômico ou similar. Também é possível ter variáveis estáticas mutáveis, mas elas exigem sincronização manual de forma que qualquer acesso a elas requer código “inseguro”. Veremos variáveis estáticas mutáveis no capítulo sobre Unsafe Rust.
- Mencione que
constse comporta semanticamente de maneira similar aoconstexprde C++. - Por outro lado,
staticé muito mais similar a umconstou variável global mutável em C++. staticfornece identidade de objeto: um endereço na memória e estado conforme exigido por tipos com mutabilidade interior tais comoMutex<T>.- Não é muito comum que alguém precise de uma constante avaliada em tempo de execução, mas é útil e mais seguro do que usar uma variável estática.
- Dados de
thread_localpodem ser criados com a macrostd::thread_local.
Tabela de propriedades:
| Propriedade | Static | Constant |
|---|---|---|
| Possui um endereço na memória | Sim | Não (inlined, i.e., expandida no local) |
| É válida durante toda a execução do programa | Sim | Não |
| Pode ser mutável | Sim (inseguro) | Não |
| Avaliada em tempo de compilação | Sim (inicializada em tempo de compilação) | Sim |
| Inlined (expandida no local) onde quer que seja utilizada | Não | Sim |