A equipe Rust tem o prazer de anunciar o lançamento de uma nova versão, 1.40.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.40.0, basta executar o seguinte comando:
 $ rustup update stable 
Se você ainda não instalou o rustup , pode instalá-lo na página correspondente do nosso site, bem como ver notas de versão detalhadas no GitHub.
O que está incluído na versão estável 1.40.0
As principais inovações são a introdução do atributo #[non_exhaustive] , melhorias nas macros!() E #[attribute] . Por fim, os avisos do analisador de migração do mutuário se tornaram erros no Rust 2015. Consulte as notas de versão para obter mais informações.
#[non_exhaustive] estruturas, enumerações e opções de enumeração
Suponha que você seja o autor de uma biblioteca alpha que contém a pub struct Foo . Você gostaria de tornar públicos os campos da estrutura alpha::Foo , mas não tem certeza se precisará adicionar mais campos ao Foo em versões futuras. Um dilema surge: ou você torna os campos privados com inconvenientes subseqüentes ou corre o risco de colocar os usuários em dependência dos campos e depois viola o código deles ao adicionar novos. O Rust 1.40.0 apresenta uma maneira de resolver o problema com #[non_exhaustive] .
O atributo #[non_exhaustive] anexado à estrutura ou variante da enumeração e impede a comparação completa dos campos, a criação da referida estrutura ou variante fora da caixa com sua declaração. O exemplo a seguir demonstra erros na caixa beta dependente de alfa:
 
O que está acontecendo nos bastidores? A visibilidade dos construtores para a estrutura #[non_exhaustive] ou opção de enumeração será reduzida para pub(crate) , proibindo, assim, seu uso em engradados de terceiros.
Talvez um aspecto mais importante de #[non_exhaustive] seja que um atributo possa ser anexado às próprias enumerações. Aqui está o código obtido de std::cmp::Ordering :
 #[non_exhaustive] pub enum Ordering { Relaxed, Release, Acquire, AcqRel, SeqCst } 
Nesse caso, #[non_exhaustive] garante a possibilidade de adicionar novas opções no futuro. Isso é possível proibindo outros pacotes de usar uma correspondência exaustiva de imagens para Ordering . O compilador rejeitaria o seguinte:
 match ordering { Relaxed | Release | Acquire | AcqRel | SeqCst => {  }  
Em vez disso, agora outros pacotes devem considerar a possibilidade de novas opções de enumeração, por exemplo, adicionando o curinga _ :
 match ordering { Relaxed | Release | Acquire | AcqRel | SeqCst => {  } _ => {  }  
Detalhes sobre o atributo #[non_exhaustive] disponíveis no relatório de estabilização .
Aprimoramentos de macro e atributo
Na 1.40.0, fizemos várias melhorias nas macros e atributos, incluindo:
- mac!()em contextos de tipo.
 
 - Por exemplo, você pode escrever o - type Foo = expand_to_type!(bar);onde- expand_to_typeserá uma macro processual.
 
 
- extern { ... }blocos- extern { ... }.
 
 - Este bloco inclui - make_item!(). Por exemplo:
 
 -  - macro_rules! make_item { ($name:ident) => { fn $name(); } } extern { make_item!(alpha); make_item!(beta); }
 
 - Agora, as macros processuais de atributo para elementos em blocos - extern { ... }também são suportadas:
 
 -  - extern "C" { #[my_identity_macro] 
 
 
- macro_rules!itens em macros procedurais.
 
 - Macros com sintaxe de função ( - mac!()) E atributos (- #[mac]) agora podem gerar- macro_rules!. Veja o relatório de estabilização em anexo para mais detalhes.
 
 
- TokenStream- $m:metasuporta- TokenStream.
 
 - Ou seja, o seguinte código está correto: 
 -  - macro_rules! accept_meta { ($m:meta) => {} } accept_meta!( my::path ); accept_meta!( my::path = "lit" ); accept_meta!( my::path ( abc ) ); accept_meta!( my::path [ abc ] ); accept_meta!( my::path { abc } );
 
 
Avisos de migração do analisador do mutuário se tornam bugs na edição Rust 2015
No release 1.35.0, relatamos que o NLL apareceu na edição Rust 2015 após o primeiro lançamento da edição 2018 no Rust 1.31 .
Como dissemos, o antigo analisador de empréstimos poderia permitir um gerenciamento inseguro de memória e, com o novo analisador (verificador de empréstimos NLL), essas deficiências foram resolvidas. Como esses erros podem interromper o código estável, decidimos introduzi-los gradualmente, verificando se o analisador antigo permitirá a montagem do programa e se o novo irá bloqueá-lo. Nesses casos, os erros foram substituídos por avisos.
A versão anterior do Rust 1.39.0 substituiu esses avisos por erros de código na edição de 2018 . O Rust 1.40.0 aplicará as mesmas alterações no código da edição de 2015 , fechando permanentemente essas falhas de segurança. Junto com isso, o compilador foi limpo até do código antigo !
Se o seu projeto não ocorrer devido às alterações acima, ou se você quiser saber mais, leia a publicação de Niko Matsakis .
Funções mais constantes na biblioteca padrão
Começando com Rust 1.40.0, a seguinte função é marcada como constante ( const fn ):
Funções estáveis na biblioteca padrão
As seguintes funções e macros foram estabilizadas no Rust 1.40.0:
- todo!()
 
 - Uma versão mais curta, mais memorável e mais conveniente da macro - unimplemented!().
 
 
- slice::repeat
 
 - Cria um - Vec<T>partir de- nrepetições de fatia.
 
 
- mem::take
 
 - Essa função pega os valores do link mutável e os substitui pelo valor padrão para esse tipo. É semelhante a - Option::takee- Cell::takee é uma abreviação conveniente para- mem::replace(&mut dst, Default::default()).
 
 
- BTreeMap::get_key_valuee- HashMap::get_key_value
 
 - Retorna um par de valores-chave que corresponde à chave fornecida. 
 
- Option::as_deref,- Option::as_deref_mut
 
 - Eles funcionam de forma semelhante a - Option::as_refe- Option::as_mut, mas usam- Derefe- DerefMutrespectivamente, então- opt_box.as_deref()e- opt_box.as_deref_mut(), em que- opt_box: Option<Box<T>>cria- Option<&T>e- Option<&mut T>respectivamente.
 
 
- Option::flatten
 
 - Essa função, como - Iterator::flatten, expande a- Option<Option<T>>para a- Option<T>, produzindo- Some(x)para- Some(Some(x))e- Nonecaso contrário.
 
 
- UdpSocket::peer_addr
 
 - Retorna o endereço do host remoto ao qual o soquete está conectado. 
 
- {f32,f64}::to_be_bytes,- {f32,f64}::to_le_bytes,- {f32,f64}::to_ne_bytes,- {f32,f64}::from_be_bytes,- {f32,f64}::from_le_bytese- {f32,f64}::from_ne_bytes
 
 - Retorna uma representação de memória de números de ponto flutuante como uma matriz de bytes com ordem de bytes big-endian (rede), little-endian ou nativo-endian. 
 
Outras mudanças
A sintaxe , o gerenciador de pacotes de carga e o analisador Clippy também sofreram algumas alterações.
Leia as notas de compatibilidade para ver se essas alterações afetam você.
Membros 1.40.0
Muitas pessoas se uniram para criar o Rust 1.40.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 , blandger , funkill , Hippolot , P0lunin , PsyHaSTe e LooMaclin .