Noções Básicas de Rust
10 exemplos para você começar com os fundamentos de Rust - 7 básicos e 3 intermediários.
Busque em todas as páginas da documentação
10 exemplos para você começar com os fundamentos de Rust - 7 básicos e 3 intermediários.
rustup default stable)cargo --version imprime 1.97 ou mais recentemainTodo programa Rust começa em main.
fn main() {
println!("Olá, Rust!");
}cargo new hello cria um esqueleto de crate bináriocargo run compila e executaprintln! é uma macro, não uma função; são valores retornadosRelacionado: Formatação e Impressão -
Displaye especificadores de formato
Variáveis são imutáveis, a menos que você opte por mut.
fn main() {
let x = 5;
// x = 6; // erro de compilação
let mut count = 0;
count += 1;
println!("{count}");
}let cria um binding; imutabilidade é o padrãomut permite reatribuição do bindinglet sem mut até que a mutação seja necessáriaRelacionado: Variáveis, Mutabilidade e Sombreamento - sombreamento e constantes
Rust tem inteiros de tamanho fixo, floats, bool e char (escalar Unicode).
fn main() {
let age: u32 = 30;
let ratio: f64 = 0.75;
let active: bool = true;
let letter: char = 'R';
println!("{age} {ratio} {active} {letter}");
}i8..i128, u8..u128, isize, usizechar tem 4 bytes (Unicode), não 1 byte como C42u64, 3.14f32Relacionado: Tipos Escalares e Compostos - tuplas e arrays
A última expressão em um bloco é o valor de retorno.
fn add(a: i32, b: i32) -> i32 {
a + b
}
fn main() {
let sum = add(2, 3);
println!("{sum}");
}main)return é explícito, mas raramente necessário; final transforma uma expressão em uma declaração (descarta o valor)Relacionado: Funções e Expressões - expressões vs declarações
if como ExpressãoRamificações podem produzir valores quando ambos os braços retornam o mesmo tipo.
fn main() {
let n = 7;
let label = if n % 2 == 0 { "even" } else { "odd" };
println!("{n} is {label}");
}if/else deve retornar tipos compatíveis em todos os braçosboolif let para correspondência de padrão único (abordado mais tarde)let temporário + mutaçãoRelacionado: Fluxo de Controle - loops e
match
Cada valor tem um único dono; atribuição move a posse para tipos não-Copy.
fn main() {
let s1 = String::from("hello");
let s2 = s1; // move - s1 não é mais válido
// println!("{s1}"); // erro: valor movido
println!("{s2}");
}String possui dados no heap; &str empresta uma fatia de stringi32) implementam Copy e duplicam em vez de mover& compartilha acesso de leitura sem transferir a posseRelacionado: Prévia de Posse (Ownership). - moves e borrows em profundidade
Empreste com & para acesso somente leitura, &mut para mutação exclusiva.
fn len(s: &String) -> usize {
s.len()
}
fn main() {
let mut text = String::from("rust");
println!("{}", len(&text));
text.push_str("ace");
println!("{text}");
}&mut ou muitos & para os mesmos dados ao mesmo tempo&[T], &str) são ponteiros "gordos" para sequências contíguasRelacionado: Referências e Fatias - sintaxe de fatia e limites
matchmatch é exaustivo: cada variante deve ser tratada.
enum Status {
Ok,
Err(u16),
}
fn describe(s: Status) -> &'static str {
match s {
Status::Ok => "success",
Status::Err(code) => {
println!("error code: {code}");
"failure"
}
}
}
fn main() {
println!("{}", describe(Status::Ok));
}_ é um braço wildcard para padrões "catch-all"code) extraem valores internos de variantes de enummatch em Option/Result é o caminho idiomático para errosRelacionado: Fluxo de Controle -
if lete loops
Result para Erros RecuperáveisFunções que podem falhar retornam Result<T, E>.
use std::fs;
fn read_config(path: &str) -> Result<String, std::io::Error> {
fs::read_to_string(path)
}
fn main() {
match read_config("config.toml") {
Ok(body) => println!("{body}"),
Err(e) => eprintln!("failed: {e}"),
}
}Ok(T) carrega o sucesso; Err(E) carrega a falha? propaga erros em funções que retornam Resultpanic!, unwrap) são para bugs irrecuperáveisanyhowRelacionado: Prévia de Posse (Ownership). - tipos de erro também são enums
Testes vivem no mesmo arquivo ou em diretórios de integração tests/.
pub fn double(n: i32) -> i32 {
n * 2
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn doubles_values() {
assert_eq!(double(3), 6);
}
}#[test] marca uma função para cargo testassert_eq! compara a saída de depuração em caso de falhatests/*.rs veem apenas a API públicaRelacionado: Melhores Práticas de Fundamentos de Rust - hábitos antes de tópicos avançados
Versões da Pilha: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026