A equipe de desenvolvimento do Rust tem o prazer de anunciar o lançamento de uma nova versão, 1.38.0. Rust é uma linguagem de programação que permite a todos criar software confiável e eficiente.
Se você instalou a versão anterior do Rust usando rustup, para atualizar para a versão 1.38.0, basta executar o seguinte comando:
rustup update stable
Se você ainda não instalou o rustup, poderá instalá-lo na página correspondente do nosso site.
O que está incluído na versão estável?
O destaque desta versão é a compilação em pipeline.
Compilação de Pipeline
O compilador precisa de dependências montadas de maneira incompleta para compilar o pacote, mas apenas seus "metadados" (lista de tipos, dependências, exportações, etc.) gerados em um estágio inicial de compilação. A partir do Rust 1.38.0, o Cargo começará imediatamente a criar pacotes dependentes assim que seus metadados estiverem disponíveis.
O tempo de compilação de um pacote não diminuiu, mas nossos testes mostraram que a velocidade de compilação aumenta de 10% a 20% no caso de compilações otimizadas (onde algumas dependências já foram compiladas). Para outros pacotes, um forte aumento na velocidade de compilação não ocorreu. O tempo necessário para compilar o pacote depende do computador, portanto, o desempenho pode variar. A compilação de pipeline é ativada automaticamente a partir da versão 1.38.0.
Verificando se há algum uso indevido de mem::{uninitialized, zeroed}
Conforme anunciado anteriormente , std::mem::uninitialized
não std::mem::uninitialized
recomendado. Em vez disso, MaybeUninit<T>
deve ser usado.
A função mem::uninitialized
ainda não foi preterida, mas isso será feito em versões futuras. Mas, apesar disso, a partir de 1.38.0, o rustc
verifica uma classe restrita de inicializações incorretas usando mem::uninitialized
ou mem::zeroed
.
Para alguns tipos, como &T
e Box<T>
, um valor nulo é considerado comportamento indefinido, pois são objetos semelhantes a ponteiros que não devem ser null
. Será um erro usar mem::uninitialized
ou mem::zeroed
para inicializar esses tipos; portanto, o compilador tentará avisá-lo se alguma dessas funções for usada para inicializar os objetos acima, e não importa se eles foram inicializados diretamente ou como campos de grande estrutura. Esta verificação é recursiva, portanto, o código a seguir gera um aviso:
struct Wrap<T>(T); struct Outer(Wrap<Wrap<Wrap<Box<i32>>>>); struct CannotBeZero { outer: Outer, foo: i32, bar: f32 } ... let bad_value: CannotBeZero = unsafe { std::mem::uninitialized() };
Leitores atentos podem perceber que a biblioteca padrão contém mais tipos que não devem ser preenchidos com zeros, especialmente NonNull<T>
e NonZero<T>
. Até o momento, a inicialização dessas estruturas com mem::uninitialized
ou mem::zeroed
não foi verificada.
Essas verificações não cobrem todos os casos de uso indevido de mem::uninitialized
ou mem::zeroed
, mas permitem detectar um código incorreto garantido que deve ser MaybeUninit
para MaybeUninit
.
#[deprecated]
para macros
O atributo #[deprecated]
, introduzido pela primeira vez no Rust 1.9.0, permite que os autores do pacote notifiquem os usuários sobre funcionalidades desatualizadas que planejam remover em versões futuras. O Rust 1.38.0 permite aplicar esse atributo às macros.
std::any::type_name
Uma representação de string do tipo usado pode ser necessária ao depurar o código. Por exemplo, no corpo de uma função genérica, convém imprimir o tipo do argumento passado. Agora isso é std::any::type_name
com std::any::type_name
:
fn gen_value<T: Default>() -> T { println!("Initializing an instance of {}", std::any::type_name::<T>()); Default::default() } fn main() { let _: i32 = gen_value(); let _: String = gen_value(); }
Resultado:
Initializing an instance of i32 Initializing an instance of alloc::string::String
Como todas as funções da biblioteca padrão, destinadas apenas à depuração, essa função não garante o conteúdo e o formato exatos da string. O valor de retorno é a melhor descrição do tipo; vários tipos podem ser representados pelo mesmo type_name
, mas podem ser alterados em versões futuras do compilador.
Alterações na biblioteca padrão
Além disso, algumas funções foram estabilizadas:
Outras mudanças
A sintaxe , o gerenciador de pacotes de carga e o analisador Clippy também sofreram algumas alterações.
Membros 1.38.0
Muitas pessoas se uniram para criar o Rust 1.38.0. Não poderíamos ter feito isso sem todos vocês, obrigado !
De tradutores
Em caso de dúvidas sobre o idioma Rust, eles poderão ajudá-lo no bate-papo do telegrama no idioma russo ou em um bate-papo semelhante para os recém-chegados .
Este artigo foi traduzido em conjunto por andreevlex , nlinker , funkill e Gymmasssorla .