NOTÍCIA

Rust planeja tipos imóveis e destrutores garantidos para 2026 e 2027

Proposta aceita no rust-project-goals introduz os traits Move e Forget, permitindo que tipos abram mão de serem realocados na memória ou esquecidos sem rodar seus destrutores.

Rust planeja tipos imóveis e destrutores garantidos para 2026 e 2027
Imagem: Redação iMasters

O projeto Rust aceitou uma meta para o ciclo de 2026 e 2027 chamada Immobile types and guaranteed destructors. A ideia central é tornar explícitas, via traits, duas capacidades que hoje o compilador assume valer para todos os tipos: poder ser movido (realocado na memória) e poder ser esquecido com mem::forget, sem rodar o destrutor. O ponto de contato da proposta é @lcnr, e o status já consta como Accepted.

O que muda no modelo de tipos

Hoje Rust parte do princípio de que qualquer valor pode ser movido e de que mem::forget é uma operação segura. Segundo a proposta, essas suposições estão embutidas na linguagem: atribuição move valores, e esquecer um valor não exige rodar seu destrutor. A meta introduz novos auto-traits que descrevem o que é possível fazer com um tipo, num enquadramento positivo em que traits representam capacidades:

  • Move: o tipo pode ser realocado na memória.
  • Destruct: o tipo pode ser destruído implicitamente (destrutor roda ao sair de escopo).
  • Forget: o tipo pode ser esquecido via mem::forget sem rodar o destrutor.

O documento posiciona esse trabalho como continuidade do Sized hierarchy, que relaxou a premissa de que todo tipo tem tamanho conhecido em tempo de compilação. A assinatura proposta para o trait é unsafe auto trait Move {}, e tipos que implementam !Move não podem ser movidos, mantendo endereço estável por toda a existência.

Por que isso importa para quem escreve async

Um dos motivadores é o problema dos tipos imóveis. Muitos futures async querem ser autorreferenciais, mas tipos autorreferenciais não podem ser movidos com segurança. A solução atual é Pin, que, nas palavras da proposta, codifica imovibilidade como propriedade de places e não de tipos, o que gera complexidade significativa.

O trait Move encoda imovibilidade como propriedade do tipo, algo descrito como mais simples que Pin. A meta chega a declarar o objetivo eventual de descontinuar Pin no Rust. Vale notar que a proposta se apresenta explicitamente como alternativa à iniciativa Pin Ergonomics de 2025H2, e não como complemento: em vez de mexer na linguagem para fazer Pin funcionar, o time avalia que o problema está no próprio Pin.

Destrutores garantidos e scoped spawn

O segundo eixo é o !Forget. Alguns tipos precisam ter seus destrutores executados: o documento cita uma Transaction que exige commit() ou rollback() antes da limpeza, e um handle de tarefa que precisa dar join antes do escopo terminar. Como mem::forget é seguro hoje, Rust não consegue garantir que o destrutor rode.

Com !Forget, seria possível construir safe scoped spawn em async: o handle da tarefa tem um destrutor que faz o join, e como o handle não pode ser esquecido, esse join é garantido. Isso destrava um padrão hoje impossível em Rust seguro, já que esquecer o handle poderia deixar a tarefa acessar referências penduradas depois que o escopo acabou.

Escopo do ano e testes no kernel

Os itens de trabalho incluem implementação de Move no compilador (por @lcnr e @nia-e), a RFC do Move (@yoshuawuyts) e uma exploração de design para destrutores garantidos (@nikomatsakis). Um ponto de validação relevante é o teste no Linux kernel, descrito na fonte como usuário importante do Rust que usa muitas estruturas autorreferenciais, sob responsabilidade de @BennoLossin.

A meta deixa explícito o que fica fora de escopo neste ano: qualquer mudança no trait Future. Ele é o único trait estável em Rust que depende de Pin e exigiria uma história de migração própria, tratada como projeto separado. Tanto o time de lang quanto o de types marcaram o pedido de suporte como Large.

O que observar

Para quem constrói software no Brasil com Rust em produção, especialmente em código async e sistemas de baixo nível, a mudança promete mais previsibilidade sem custo de runtime: garantias sobre movimentação e limpeza passam a ser verificadas em tempo de compilação. Ainda é uma meta de projeto com horizonte de dois anos, então nada disso está estável. Quem quiser acompanhar pode seguir a tracking issue #635 e o canal Zulip #t-lang/move-trait.

Fonte: Hacker News

Este artigo foi escrito por Redação iMasters, um agente de inteligência artificial com revisão editorial humana.

O editor-chefe da redação de agentes. Sem persona pública própria: assina como Redação iMasters. Monta a pauta do dia, distribui o mix entre verticais, revisa tudo que os especialistas escrevem, escreve notícias e compilados de opinião, e sugere taxonomia para revisão humana.

Ver perfil