💻 Exemplos: Capítulo 04: Funções, Expressões vs Declarações e Escopo Léxico
💻 Exemplos: Capítulo 04: Funções, Expressões e Escopo Léxico
Especialização em Sistemas com Rust • Demonstrações Práticas Compiláveis
🎯 Objetivo dos Exemplos
Apresentar a distinção formal entre Statements (declarações com ponto e vírgula que avaliam para o tipo Unit ()) e Expressions (expressões sem ponto e vírgula que produzem valores), funções com tipos explícitos de retorno e escopo léxico na stack.
1. Código Fonte Completo (src/main.rs)
//! Demonstração de Funções Puras, Expressões de Bloco e Escopo em Rust
/// Calcula a potência aparente em um circuito elétrico trifásico (VA)
/// Demonstra retorno implícito (sem a palavra-chave return e sem ponto e vírgula)
fn calcular_potencia_trifasica(tensao_volts: f64, corrente_amperes: f64) -> f64 {
// Expressão final: seu valor é retornado automaticamente
tensao_volts * corrente_amperes * 1.73205
}
/// Demonstra retorno antecipado condicional (early return) com a instrução return
fn autenticar_requisicao(token: &str, tamanho_carga_bytes: usize) -> bool {
// Se o token for inválido, rejeita imediatamente
if token.is_empty() || !token.starts_with("SEC_") {
return false;
}
// Se a carga for excessiva, rejeita
if tamanho_carga_bytes > 1_048_576 {
return false; // Maior que 1 MB
}
true // Autorizado
}
fn main() {
println!("=== ANATOMIA DE FUNÇÕES E ESCOPO LÉXICO ===");
// 1. Invocando função com retorno implícito
let tensao = 380.0;
let corrente = 32.5;
let potencia_va = calcular_potencia_trifasica(tensao, corrente);
println!("Potência Trifásica Calculada: {:.2} VA", potencia_va);
// 2. Early return em validação de segurança
let token_valido = "SEC_KEY_99812";
let token_invalido = "USR_GUEST";
println!("Autenticação token válido: {}", autenticar_requisicao(token_valido, 512));
println!("Autenticação token inválido: {}", autenticar_requisicao(token_invalido, 512));
// 3. Blocos de Código como Expressões
// Um bloco { ... } delimita escopo e retorna a última expressão
let resultado_bloco = {
let fator_ajuste = 1.15;
let base_calculo = 200.0;
// Esta expressão final sem ponto e vírgula define o valor de 'resultado_bloco'
base_calculo * fator_ajuste
};
println!("Resultado computado dentro do bloco de escopo: {}", resultado_bloco);
// 4. Escopo Léxico e Desalocação Automática da Pilha
println!("\nDemonstrando ciclo de vida de variáveis no escopo:");
let nivel_global = 100;
{
let nivel_interno = 200;
println!(" Dentro do bloco interno: global={}, interno={}", nivel_global, nivel_interno);
// 'nivel_interno' é desalocado da stack ao sair desta chave '}'
}
// println!("{}", nivel_interno); // ERRO DE COMPILAÇÃO: 'nivel_interno' não existe neste escopo!
println!("Fora do bloco interno: global continua ativo ({})", nivel_global);
// 5. O Tipo Unit ()
// Declarações com ponto e vírgula produzem o tipo '()' (tupla vazia)
let unidade: () = {
let _x = 5;
// Ponto e vírgula transforma a linha em Statement, retornando ()
};
println!("O tipo unit representa ausência de valor: {:?}", unidade);
}
2. Saída Esperada no Terminal
=== ANATOMIA DE FUNÇÕES E ESCOPO LÉXICO ===
Potência Trifásica Calculada: 21390.82 VA
Autenticação token válido: true
Autenticação token inválido: false
Resultado computado dentro do bloco de escopo: 230
Demonstrando ciclo de vida de variáveis no escopo:
Dentro do bloco interno: global=100, interno=200
Fora do bloco interno: global continua ativo (100)
O tipo unit representa ausência de valor: ()