Visão geral da linguagem Rust
Edição Rust 2024 — linguagem de sistemas | segurança de memória sem GC | simultaneidade destemida | abstrações de custo zero
Paradigma
Multiparadigma: imperativo, funcional, orientado a objetos (traços), orientado a dados. Tipagem estática com inferência completa, sistema de tipos nominais, tipos de dados algébricos. Compilação via LLVM. O verificador de empréstimo reforça a segurança da memória em tempo de compilação.
Tipos
| Categoria |
Tipos |
| Assinado |
i8 i16 i32 i64 i128 isize |
| Int não assinado |
u8 u16 u32 u64 u128 usize |
| Flutuar |
f32 f64 |
| Bool |
bool |
| Caráter |
char (escalar Unicode de 4 bytes) |
| Unidade |
() |
| Fatia |
&[T] &mut [T] |
| Matriz |
[T; N] |
| Tupla |
(T1, T2, ...) |
| Referência |
&T &mut T |
| Ponteiro bruto |
*const T *mut T |
| Opção |
Option<T> |
| Resultado |
Result<T, E> |
| Corda |
String &str |
| Caixa |
Box<T> (alocação de heap) |
| Vec |
Vec<T> (matriz dinâmica) |
| Ponteiros inteligentes |
Rc<T> Arc<T> Cell<T> RefCell<T> |
| Ponteiro de função |
fn(T) -> U |
| Encerramento |
|args| body (tipo exclusivo por fechamento) |
| Objeto de característica |
dyn Trait |
| Nunca |
! (divergente) |
Declarações
| Construir |
Sintaxe |
Notas |
| Função |
fn name(params) -> Ret { body } |
|
| Método |
fn name(&self, params) -> Ret { body } |
Em impl bloquear |
| Variável |
let x = expr; |
Imutável por padrão |
| Mutável |
let mut x = expr; |
|
| Desestruturar |
let (a, b) = tuple; |
|
| Constante |
const NAME: T = expr; |
Tempo de compilação, embutido |
| Estático |
static NAME: T = expr; |
Endereço fixo |
| Estrutura |
struct Name { field: T } |
Campos nomeados |
| Estrutura de tupla |
struct Name(T1, T2); |
|
| Estrutura da unidade |
struct Name; |
|
| Enum |
enum Name { Variant, Var(T) } |
ADT |
| União |
union Name { f1: T1, f2: T2 } |
Inseguro |
| Característica |
trait Name { fn method(&self); } |
|
| Impl. |
impl Type { fn ... } |
|
| Característica Impl |
impl Trait for Type { fn ... } |
|
| Digite o alias |
type Alias = T; |
|
| Importar |
use crate::module::Item; |
|
| macro |
macro_rules! name { ... } |
|
| Módulo |
mod name; |
|
| Caixa |
extern crate name; (edição 2015) |
|
Propriedade e empréstimo
Each value has exactly one owner.
Ownership can be moved (assignment, function call).
References (&T) borrow without taking ownership.
Mutable references (&mut T) are exclusive — only one at a time.
References must never outlive their referent (lifetimes).
Regras de empréstimo
- Um
&mut T XOR muitos &T a qualquer momento
- As referências são sempre válidas (sem ponteiros pendentes)
- Tempos de vida omitidos quando inequívocos (
'a, 'static)
Fluxo de controle
| Construir |
Sintaxe |
Notas |
| Se |
if cond { ... } else { ... } |
Expressão |
| Se-deixe |
if let Pattern(expr) = val { ... } |
Desestruturar + combinar |
| Enquanto |
while cond { ... } |
|
| Enquanto-deixe |
while let Some(v) = opt { ... } |
|
| Para |
for x in iter { ... } |
Usa IntoIterator |
| Ciclo |
loop { ... } |
Infinito (pode break com valor) |
| Partida |
match expr { Pattern => body, ... } |
Exaustivo |
| Pausa |
break; / break val; |
|
| Continuar |
continue; |
|
| Retorno |
return expr; |
A expressão no final do bloco também retorna |
Padrões de correspondência
Pattern := Literal | Identifier | _ | ref | mut | @ binding
| Tuple(x, y) | Struct { field } | Enum::Variant(x)
| x | y (OR) | x @ y (bind) | .. (rest)
| ... (inclusive range) | ..= (inclusive range)
Guards := Pattern if condition => body
Operadores
| Categoria |
Operadores |
| Aritmética |
+ - * / % |
| Comparação |
== != < > <= >= |
| Lógico |
&& || ! |
| Bit a bit |
& | ^ ! << >> |
| Composto |
+= -= *= /= %= &= |= ^= <<= >>= |
| Alcance |
.. ..= .. (semi-aberto) ..= (inclusive) |
| Deref |
*expr |
| Referência |
&expr &mut expr |
| Ponto de interrogação |
expr? (retorno antecipado em Err/None) |
| Peixe turbo |
::<T> (anotação de tipo em genéricos) |
| Atributo |
#[attr] #![attr] |
Sistema de características
Características padrão (selecionadas)
| Característica |
Objetivo |
Clone |
Cópia profunda (x.clone()) |
Copy |
Cópia bit a bit (implícita, opcional) |
Drop |
Destruidor |
Default |
Valor padrão |
Debug |
Formatar com {:?} |
Display |
Formato voltado para o usuário {} |
Eq / PartialEq |
Comparação de igualdade |
Ord / PartialOrd |
Comparação de pedidos |
Hash |
Hashing |
Iterator |
fn next(&mut self) -> Option<Item> |
IntoIterator |
Converter em iterador |
From / Into |
Conversão de tipo |
TryFrom / TryInto |
Conversão falível |
Deref |
Desreferência implícita |
AsRef / AsMut |
Conversão de referência |
Borrow / BorrowMut |
Emprestar como outro tipo |
Send / Sync |
Marcadores de segurança de linha |
Sized |
Tamanho conhecido em tempo de compilação |
Fn FnMut FnOnce |
Traços de fechamento |
impl Trait / dyn Trait
impl Trait — tipo de retorno opaco (despacho estático)
dyn Trait — objeto de característica (despacho dinâmico)
where cláusulas para limites complexos: fn f<T>() where T: Clone + Debug
Genéricos
fn id<T: Display>(x: T) -> T { x }
struct Pair<T, U> { first: T, second: U }
enum Option<T> { Some(T), None }
impl<T: Clone> Pair<T, T> { fn duplicate(&self) -> Self { ... } }
Modelo de memória
Alocação
- Pilha: variáveis locais, matrizes de tamanho fixo
- Pilha:
Box<T>, Vec<T>, String, Rc<T>, Arc<T>
alloc / Layout para alocação manual (em std::alloc)
Ponteiros inteligentes
Box<T> — alocação de heap de propriedade, proprietário único
Rc<T> — contagem de referência (não threadsafe)
Arc<T> — contado atomicamente por referência (threadsafe)
Cell<T> — mutabilidade interior para Copy tipos
RefCell<T> — verificação de empréstimo em tempo de execução
Mutex<T> / RwLock<T> — mutabilidade interna segura para thread
UnsafeCell<T> — mutabilidade interna bruta
Simultaneidade
| Primitivo |
Localização |
std::thread::spawn |
Criação de tópico |
std::sync::mpsc |
Canais multiprodutores e consumidores únicos |
crossbeam::channel |
Canais multiprodutor e multiconsumidor (externo) |
Mutex<T> RwLock<T> |
Primitivas de sincronização |
Arc<T> |
Contagem de referência atômica |
std::sync::Barrier Condvar |
Coordenação |
async/await (desde 1.39) |
Async/await com futuros |
tokio / async-std |
Tempos de execução assíncronos (externos) |
std::sync::Once OnceLock LazyLock |
Inicialização única |
Biblioteca Padrão (módulos selecionados)
| Módulo |
Conteúdo |
std::io |
Read Write BufRead BufReader BufWriter Stdin Stdout |
std::fs |
File read write create_dir remove_file metadata |
std::net |
TcpStream TcpListener UdpSocket IpAddr |
std::collections |
Vec HashMap HashSet BTreeMap BTreeSet LinkedList VecDeque BinaryHeap |
std::path |
Path PathBuf |
std::env |
args var current_dir temp_dir |
std::process |
Command Output Child exit |
std::time |
Duration Instant SystemTime |
std::sync |
Mutex RwLock Arc Barrier Condvar Once mpsc |
std::thread |
spawn sleep park yield_now current |
std::ffi |
CString CStr OsString OsStr |
std::os |
Extensões específicas da plataforma |
std::ptr |
read write null NonNull addr_of addr_of_mut |
Tratamento de erros
// Recoverable: Result<T, E>
fn div(a: i32, b: i32) -> Result<i32, String> {
if b == 0 { Err("division by zero".into()) }
else { Ok(a / b) }
}
let r = div(10, 2)?; // early return on Err
// Unrecoverable: panic!
panic!("something went wrong");
// Expected/unexpected split
// Result for recoverable, panic for programmer errors
Rust inseguro
unsafe { ... } blocos permitem:
- Desreferência de ponteiro bruto
- Chame funções inseguras (FFI)
- Access/modify estática mutável
- Implementar características inseguras
- Acesso ao campo da união
O verificador de empréstimo ainda se aplica dentro de unsafe.
Teste
#[test]
fn test_addition() {
assert_eq!(2 + 2, 4);
assert!(true);
assert_ne!(1, 2);
}
Atributos de teste
#[test] #[should_panic] #[ignore] #[cfg(test)] #[bench]
| Componente |
Objetivo |
rustc |
Compilador (LLVM back-end) |
cargo |
Gerenciador de pacotes, sistema de compilação |
rustup |
Gerenciador de conjunto de ferramentas |
rustfmt |
Formatador de código |
clippy |
Linter |
rust-analyzer |
Servidor LSP |
cargo-doc |
Gerador de documentação |
cargo-test |
Executor de testes |
cargo-bench |
Referências |
cargo-clippy |
Verificações de fiapos |
Edições
| Edição |
Principais mudanças |
| 2015 |
Edição estável inicial |
| 2018 |
Tempos de vida não lexicais, alterações no sistema do módulo, impl Trait, dyn Trait |
| 2021 |
Alterações de prelúdio, IntoIterator para matrizes, campo de edição Cargo.toml obrigatório |
| 2024 |
impl Trait em todos os lugares, gen blocos, unsafe atributos, if let cadeias estáveis, nunca digite ! estável |
Compilação
rustc file.rs # compile
cargo new project # new project
cargo build # debug build
cargo build --release # release build
cargo run # build + run
cargo test # run tests
cargo doc --open # generate docs
cargo check # type-check without codegen
Alvos
x86_64-unknown-linux-gnu aarch64-unknown-linux-gnu x86_64-pc-windows-msvc x86_64-apple-darwin wasm32-unknown-unknown wasm32-wasi thumbv7em-none-eabihf (mais de 100 alvos)
Interoperabilidade C
// FFI declaration
extern "C" {
fn printf(fmt: *const u8, ...) -> i32;
}
// Linking
#[link(name = "m")]
extern "C" { fn sqrt(x: f64) -> f64; }
// ABI types
// i32 → c_int, u64 → c_ulonglong, *const T → *const c_void