A equipe de desenvolvimento do Rust tem o prazer de anunciar o lançamento de uma nova versão do Rust: 1.28.0. Rust é uma linguagem de programação de sistema destinada a segurança, velocidade e execução de código paralelo.
Se você possui uma versão anterior do Rust instalada usando rustup, faça o upgrade do Rust para a versão 1.28.0:
$ rustup update stable
Se você ainda não instalou o rustup, poderá instalá-lo na página correspondente do nosso site. Notas de versão detalhadas do Rust 1.28.0 estão disponíveis no GitHub.
O que está incluído na versão estável 1.28.0
Alocadores Globais
Usando alocadores, os programas Rust obtêm memória em tempo de execução. Anteriormente, o Rust não permitia alterar a maneira como a memória era alocada, o que limitava seu uso em alguns casos. Em algumas plataformas, o jemalloc foi usado, em outras - um alocador de sistema, mas os usuários não podiam controlá-lo. Na liberação 1.28.0, o atributo #[global_allocator]
é estabilizado, o que permite aos programas Rust selecionar um alocador de sistema, bem como definir novos alocadores, implementando a GlobalAlloc
.
O alocador padrão para programas Rust em algumas plataformas é jemalloc. A biblioteca padrão agora fornece um identificador de alocador de sistema que você pode usar para alternar para o uso do alocador de sistema, quando necessário, por declaração estática com o atributo #[global_allocator]
.
use std::alloc::System; #[global_allocator] static GLOBAL: System = System; fn main() { let mut v = Vec::new();
No entanto, às vezes você precisa definir seu próprio alocador para uma área funcional específica do seu aplicativo. Isso também é relativamente fácil de implementar, implementando a GlobalAlloc
. Você pode ler mais sobre como fazer isso na documentação .
O trabalho para melhorar o diagnóstico continua, desta vez com ênfase na formatação:
format!("{_foo}", _foo = 6usize);
Anteriormente, a mensagem de erro nesse local era bastante escassa:
error: invalid format string: expected `'}'`, found `'_'` | 2 | format!("{_foo}", _foo = 6usize); | ^^^^^^^^
Agora, uma nova mensagem de diagnóstico indica o motivo específico da sequência de formato inválida:
error: invalid format string: invalid argument name `_foo` | 2 | let _ = format!("{_foo}", _foo = 6usize); | ^^^^ invalid argument name in format string | = note: argument names cannot start with an underscore
Veja as notas de versão para mais detalhes.
Estabilização da biblioteca padrão
Além da estabilização de GlobalAlloc
já mencionada, os tipos de número diferente de NonZero
são estabilizados nesta versão. Esses são tipos de wrapper em torno dos tipos inteiros não assinados padrão: NonZeroU8
, NonZeroU16
, NonZeroU32
, NonZeroU64
, NonZeroU128
e NonZeroUsize
.
Eles permitem otimizar o tamanho dos dados armazenados. Por exemplo, a Option<u8>
ocupa dois bytes, enquanto a Option<NonZeroU8>
um. Observe que essa otimização persiste mesmo quando o NonZeroU8
envolvido em outra estrutura; o exemplo abaixo mostra que o Door
ainda ocupa um byte, mesmo quando é colocado dentro do Option
. Essa otimização também se aplica a enumerações definidas pelo usuário; a Option
não Option
especial aqui.
use std::mem; use std::num::NonZeroU8; struct Key(NonZeroU8); struct Door { key: Key, } fn main() { assert_eq!(mem::size_of::<Door>(), 1); assert_eq!(mem::size_of::<Option<Door>>(), 1); }
Muitos outros componentes da biblioteca também foram estabilizados, cuja lista completa pode ser encontrada nas notas de versão detalhadas.
Aprimoramentos de carga
O Cargo não permitirá mais que você publique pacotes com scripts de construção que modificam o diretório src. O diretório src
no pacote deve ser considerado imutável.
Desenvolvedores 1.28.0
Muitas pessoas participaram do desenvolvimento do Rust 1.28. Não poderíamos ter concluído o trabalho sem cada um de vocês. Obrigada
De um tradutor: expresso minha gratidão aos membros da comunidade ruRust e pessoalmente ozkriff por sua ajuda na tradução e revisão