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

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

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

Ponteiros inteligentes

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:

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]

Conjunto de ferramentas

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