Apresento a sua atenção uma tradução da publicação sobre a nova versão da linguagem de programação favorita de todos, Rust .
1. Introdução
A equipe da linguagem de programação Rust tem o prazer de anunciar uma nova versão, 1.35.0. Rust é uma linguagem de programação que permite a todos desenvolver software rápido e confiável.
Se você instalou a versão anterior do Rust usando rustup
, obter a versão atual não será difícil:
$ rustup update stable
Se você ainda não possui rustup
, pode obtê-lo na página correspondente em nosso site. Uma revisão detalhada desta versão está disponível no GitHub.
O que está incluído na versão estável?
As principais inovações desta versão incluem a implementação das características FnOnce, FnMut
e Fn
nas estruturas Box<dyn FnOnce>
, Box<dyn FnMut>
e Box<dyn Fn>
, respectivamente.
Assim como as funções em linha (tampas) podem ser convertidas em ponteiros de função não seguros. Macro dbg!
introduzido no Rust 1.32.0 agora pode ser chamado sem especificar argumentos.
Além disso, esta versão introduziu muitas estabilizações da biblioteca padrão. Abaixo estão os mais significativos, mas uma análise detalhada de alguns deles está disponível.
Características Fn*
implementadas na Box<dyn Fn*>
No Rust 1.35.0, as características FnOnce
, FnMut
e Fn
FnMut
implementadas nas Box<dyn FnOnce>
, Box<dyn FnMut>
e Box<dyn Fn>
respectivamente.
No passado, se você queria chamar uma função encapsulada na Box<T>
, era necessário usar o FnBox
, porque os objetos Box<dyn FnOnce>
e similares não implementavam as características Fn*
correspondentes. Também interferiu na transferência de funções encapsuladas na Box<T>
para o código que estava aguardando o implementador da característica Fn
(foi proposto criar funções temporárias em linha).
Isso foi causado pela incapacidade do compilador em detectar essas implementações. Essa falha foi corrigida com a introdução de unsized_locals
.
No entanto, agora você pode usar as funções encapsuladas na Box<T>
mesmo em locais que esperam que uma característica funcional seja implementada. Por exemplo, o código abaixo é compilado sem erros:
fn foo(x: Box<dyn Fn(u8) -> u8>) -> Vec<u8> { vec![1, 2, 3, 4].into_iter().map(x).collect() }
Box<dyn FnOnce>
podem ser chamados sem Box<dyn FnOnce>
barulho:
fn foo(x: Box<dyn FnOnce()>) { x() }
Convertendo em ponteiros não seguros
Desde os tempos do Rust 1.19.0, tornou-se possível converter funções incorporadas que não capturam o ambiente em ponteiros de função. Por exemplo, você pode escrever:
fn twice(x: u8, f: fn(u8) -> u8) -> u8 { f(f(x)) } fn main() { assert_eq!(42, twice(0, |x| x + 21)); }
Infelizmente, porém, esse recurso não foi expandido para ponteiros de função não seguros. Esta versão introduziu as alterações descritas acima:
Ligue para dbg!()
Sem argumentos
Devido à abundância de chamadas de println!
como depuradores de farm coletivos, a macro dbg!
foi introduzida no Rust 1.32.0 dbg!
. Lembre-se de que essa macro permite capturar rapidamente o resultado de uma determinada expressão com contexto:
fn main() { let mut x = 0; if dbg!(x == 1) { x += 1; } dbg!(x); }
As linhas de código acima imprimirão no terminal o resultado da expressão x == 1
e x
respectivamente:
[src/main.rs:4] x == 1 = false [src/main.rs:8] x = 0
Conforme mencionado na seção anterior, onde uma função de ordem superior, call_unsafe_fn_ptr
pode ser chamada, dbg!()
Também deve ser chamada sem especificar argumentos. Isso pode ser extremamente útil para descobrir ramificações selecionadas do programa:
fn main() { let condition = true; if condition { dbg!();
Estabilização da biblioteca padrão
No Rust 1.35.0, muitos componentes da biblioteca padrão foram estabilizados. Além disso, algumas implementações foram introduzidas, sobre as quais você pode ler aqui .
Copie o sinal de um número de ponto flutuante para outro número
Com esta versão, novos métodos de copysign
foram adicionados às primitivas de ponto flutuante (mais especificamente, f32
e f64
):
Como o nome dos métodos sugeridos, você pode usá-los para copiar o sinal de um número para outro:
fn main() { assert_eq!(3.5_f32.copysign(-0.42), -3.5); }
Verificando se o Range
contém um valor específico
O Rust 1.35.0 adquiriu alguns novos métodos nas estruturas Range*
:
Usando esses métodos, você pode facilmente verificar se um determinado valor está em um intervalo. Por exemplo, você pode escrever:
fn main() { if (0..=10).contains(&5) { println!("5 [0; 10]."); } }
Traduzir (mapa) e dividir o RefCell
emprestado
Com o advento do Rust 1.35.0, você pode converter e dividir o valor RefCell
emprestado em um conjunto de valores emprestados em diferentes componentes dos dados emprestados:
RefCell
valor RefCell
através da função embutida
Esta versão apresenta o conveniente método replace_with
declarado na estrutura RefCell
:
Hash de um ponteiro ou link para
Esta versão apresenta a função ptr::hash
, que usa um ponteiro bruto para o hash. O uso de ptr::hash
pode impedir o hash de um valor especificado ou referenciado em vez do próprio endereço.
Option<&T>
copiar conteúdo Option<&T>
Com o início do Rust 1.0.0, os métodos Option::cloned
nas Option<&T>
e Option<&mut T>
tornaram possível clonar o conteúdo, se este estivesse presente ( Some(_)
). No entanto, a clonagem às vezes pode ser uma operação cara e os métodos opt.cloned()
não descrevem nenhuma dica.
Esta versão contribuiu:
A funcionalidade de opt.copied()
é a mesma que opt.cloned()
. No entanto, o método descrito acima solicita as condições T: Copy
, cuja falha causará um erro de compilação.
Alterações em Clippy
Clippy, uma ferramenta que detecta imperfeições comuns para melhorar a qualidade do código, adquiriu drop_bounds
. Funciona quando a função generalizada solicita o preenchimento da condição T: Drop
:
fn foo<T: Drop>(x: T) {}
Isso geralmente é um erro, pois os primitivos não implementam o Drop
. Além disso, o T: Drop
não abrange tipos como String
, que não têm um comportamento destrutivo, mas o resultado de tipos embutidos (como Vec<u8>
).
Além de drop_bounds
, esta versão divide redundant_closure
em redundant_closure
e redundant_closure_for_method_calls
.
Leia a versão detalhada do Clippy aqui .
Mudanças na carga
Uma descrição detalhada das alterações de carga está disponível aqui .
Membros 1.35.0
Muitas pessoas se uniram para criar o Rust 1.35.0. Não poderíamos ter feito isso sem todos vocês, obrigado !
Do tradutor
Em caso de dúvidas sobre o idioma Rust, eles poderão ajudá-lo no bate-papo por telegrama no idioma russo ou em um bate-papo semelhante para os novatos .