Folha de Consulta Rust
Última atualização
Hello World e estrutura
Um programa Rust começa em fn main; as instruções terminam em ponto e vírgula.
| Operação | Sintaxe |
|---|---|
| Ponto de entrada | fn main() { ... } |
| Exibir uma linha | println!("Hello, World!"); |
| Exibir com valores | println!("{} is {}", name, age); |
| Exibir forma de debug | println!("{:?}", value); |
| Comentário de linha | // comment |
| Usar um item de um módulo | use std::collections::HashMap; |
| Compilar e executar | cargo run |
| Compilar um binário de release | cargo build --release |
Variáveis e tipos (let / mut)
As vinculações são imutáveis por padrão; adicione mut para permitir reatribuição.
| Operação | Sintaxe |
|---|---|
| Vinculação imutável | let x = 5; |
| Vinculação mutável | let mut count = 0; |
| Tipo explícito | let age: u32 = 30; |
| Constante | const MAX: u32 = 100; |
| Shadowing | let x = x + 1; |
| Tipos inteiros | i32, u32, i64, usize |
| Outros escalares | f64, bool, char |
| Tupla | let pair: (i32, &str) = (1, "a"); |
| Conversão de tipo | let f = x as f64; |
Controle de fluxo
if é uma expressão, e Rust tem três formas de laço.
| Operação | Sintaxe |
|---|---|
| If / else | if x > 0 { ... } else { ... } |
| If como expressão | let y = if x > 0 { 1 } else { -1 }; |
| Laço infinito | loop { ... } |
| Laço que retorna um valor | let v = loop { break 5; }; |
| Laço while | while x < 100 { ... } |
| For sobre um range | for i in 0..10 { ... } |
| For sobre uma coleção | for item in &items { ... } |
| Break / continue | break;, continue; |
Funções
A última expressão (sem ponto e vírgula) é o valor de retorno.
| Operação | Sintaxe |
|---|---|
| Função básica | fn add(a: i32, b: i32) -> i32 { a + b } |
| Retorno explícito | fn f() -> i32 { return 5; } |
| Sem valor de retorno | fn log(msg: &str) { ... } |
| Receber uma referência | fn len(s: &String) -> usize { s.len() } |
| Closure | let add = |a, b| a + b; |
| Closure com tipo | let sq = |x: i32| -> i32 { x * x }; |
| Função como argumento | fn apply(f: impl Fn(i32) -> i32) { ... } |
Ownership e borrowing
Cada valor tem um único dono; referências o tomam emprestado sem assumir a posse.
| Operação | Sintaxe |
|---|---|
| Move (transfere a posse) | let b = a; (a deixa de ser válido) |
| Clone (cópia profunda) | let b = a.clone(); |
| Empréstimo imutável | let r = &x; |
| Empréstimo mutável | let r = &mut x; |
| Empréstimo em uma função | fn read(s: &String) { ... } |
| Desreferenciar | *r |
| Regra de borrowing | Vários & OU um &mut por vez, não ambos |
| Slice (toma emprestado um intervalo) | let part = &arr[1..3]; |
Structs e enums
Structs agrupam dados relacionados; enums modelam um valor que é uma de várias variantes.
| Operação | Sintaxe |
|---|---|
| Definir uma struct | struct Point { x: i32, y: i32 } |
| Criar uma instância | let p = Point { x: 1, y: 2 }; |
| Acessar um campo | p.x |
| Tuple struct | struct Pair(i32, i32); |
| Método (bloco impl) | impl Point { fn dist(&self) -> f64 { ... } } |
| Função associada | impl Point { fn new() -> Self { ... } } |
| Definir um enum | enum Shape { Circle(f64), Rect(f64, f64) } |
| Enum com campos nomeados | enum Msg { Move { x: i32, y: i32 } } |
| Derivar traits | #[derive(Debug, Clone)] |
Correspondência de padrões (match)
match compara um valor com padrões e precisa ser exaustivo.
| Operação | Sintaxe |
|---|---|
| Corresponder em valores | match x { 1 => "one", _ => "other" } |
| Corresponder a um enum | match shape { Shape::Circle(r) => ... } |
| Corresponder a um range | match n { 1..=5 => ..., _ => ... } |
| Vincular com uma guarda | match x { n if n > 0 => ... } |
| Corresponder a uma tupla | match point { (0, y) => ..., (x, _) => ... } |
| if let (padrão único) | if let Some(v) = opt { ... } |
| while let | while let Some(v) = stack.pop() { ... } |
| Desestruturar uma struct | let Point { x, y } = p; |
Traits e generics
Traits definem comportamento compartilhado; generics fazem o código funcionar com muitos tipos.
| Operação | Sintaxe |
|---|---|
| Definir um trait | trait Area { fn area(&self) -> f64; } |
| Implementar um trait | impl Area for Circle { fn area(&self) -> f64 { ... } } |
| Método padrão | trait Greet { fn hi(&self) { ... } } |
| Função genérica | fn largest<T: PartialOrd>(list: &[T]) -> &T { ... } |
| Struct genérica | struct Wrapper<T> { value: T } |
| Limite de trait (where) | fn f<T>(x: T) where T: Display { ... } |
| Argumento impl Trait | fn print(item: impl Display) { ... } |
| Trait object | let shapes: Vec<Box<dyn Area>> = ...; |
Tratamento de erros (Result / Option)
Rust modela a ausência com Option e erros recuperáveis com Result.
| Operação | Sintaxe |
|---|---|
| Valor opcional | Option<T>: Some(v) ou None |
| Tipo Result | Result<T, E>: Ok(v) ou Err(e) |
| Retornar um Result | fn read() -> Result<String, Error> { ... } |
| Propagar com ? | let data = read()?; |
| Unwrap (causa panic em None/Err) | opt.unwrap() |
| Valor padrão | opt.unwrap_or(0) |
| Mapear um valor | opt.map(|v| v + 1) |
| Tratar ambos os braços | match res { Ok(v) => ..., Err(e) => ... } |
| Converter Option em Result | opt.ok_or("missing")? |
Coleções comuns (Vec / HashMap)
Vec é um array que cresce; HashMap é um armazenamento chave-valor.
| Operação | Sintaxe |
|---|---|
| Criar um vetor | let mut v: Vec<i32> = Vec::new(); |
| Literal de vetor | let v = vec![1, 2, 3]; |
| Push / pop | v.push(4);, v.pop(); |
| Acesso por índice | v[0] |
| Acesso seguro | v.get(0) retorna Option<&T> |
| Iterar | for x in &v { ... } |
| Comprimento | v.len() |
| Criar um map | let mut m: HashMap<String, i32> = HashMap::new(); |
| Inserir / obter | m.insert(k, v);, m.get(&k) |
| API Entry | *m.entry(k).or_insert(0) += 1; |
A sintaxe de Rust que você mais usa, em uma única página. Esta folha de consulta Rust é uma referência rápida para o núcleo da linguagem - variáveis e mutabilidade, ownership e borrowing, structs e enums, correspondência de padrões, traits e generics, e os tipos Result e Option por trás do tratamento de erros de Rust.
Tudo aqui é Rust padrão que compila em uma toolchain stable recente. Copie o que precisar ou teste cada trecho ao vivo no playground de Rust - sem necessidade de instalar o cargo.
Perguntas frequentes sobre a folha de consulta Rust
Esta folha de consulta Rust é gratuita?
O que são ownership e borrowing em Rust?
&x para um empréstimo imutável ou &mut x para um mutável. O compilador impõe uma regra: você pode ter vários empréstimos imutáveis ou exatamente um empréstimo mutável por vez, o que previne disputas de dados em tempo de compilação.Qual é a diferença entre Result e Option em Rust?
Option<T> representa um valor que pode estar ausente - é Some(v) ou None, e você o usa quando não há erro a relatar, apenas um valor faltando. Result<T, E> representa uma operação que pode falhar - é Ok(v) ou Err(e), carregando um valor de erro quando algo dá errado. Use Option para "talvez exista" e Result para "isto pode falhar"; o operador ? propaga ambos.