💻 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: ()