Como passar em uma entrevista sobre Rust: perguntas e respostas avançadas

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Como passar em uma entrevista sobre Rust: principais perguntas de nível avançado

\n\n

Rust é uma linguagem de programação de sistemas que está ganhando popularidade devido à sua segurança, desempenho e ausência de coletor de lixo. Se você já domina os fundamentos e está se preparando para uma entrevista para uma posição de desenvolvedor Rust Sênior ou Pleno, enfrentará perguntas que vão além da sintaxe simples. Neste artigo, analisaremos os principais tópicos avançados que frequentemente aparecem em entrevistas técnicas.

\n\n

Abordaremos quatro blocos: ownership e borrowing, lifetimes, código unsafe e macros, além de multithreading avançado. Cada seção contém perguntas reais e exemplos de código.

\n\n

1. Ownership, borrowing e regras de mutabilidade

\n\n

Pergunta: Explique como funciona o mecanismo de ownership em Rust. Qual é a diferença entre &T, &mut T e Box<T>?

\n\n

Resposta: Ownership é a base da segurança de memória em Rust. Cada valor tem exatamente um dono. Quando o dono sai do escopo, o valor é destruído. Borrowing (&T) permite "emprestar" temporariamente uma referência aos dados sem transferir a ownership. O borrowing mutável (&mut T) dá o direito de modificar os dados, mas apenas na ausência de outras referências.

\n\n

Box<T> é um ponteiro inteligente que aloca memória no heap. Ele transfere a ownership, o que o diferencia de referências simples.

\n\n
fn main() {\n    let mut s = String::from("Olá");\n    let r1 = &s;      // referência imutável\n    let r2 = &mut s;  // Erro! não é possível ter &mut e & ao mesmo tempo\n    // println!("{}", r1);\n}\n
\n\n

Pergunta: O que é a "regra de um único borrowing mutável"?

\n\n

Resposta: A qualquer momento, um valor pode ter uma referência mutável ou qualquer número de referências imutáveis, mas não ambas ao mesmo tempo. Isso previne condições de corrida em tempo de compilação.

\n\n

2. Lifetimes — como o compilador entende que uma referência é válida

\n\n

Pergunta: Por que as anotações de lifetime são necessárias? Dê um exemplo em que elas são obrigatórias.

\n\n

Resposta: As anotações de lifetime ('a, 'b, etc.) ajudam o compilador a verificar se todas as referências são válidas. Elas são obrigatórias quando uma função retorna uma referência vinculada a um dos parâmetros de entrada e o compilador não consegue inferir o lifetime automaticamente.

\n\n
// Função que retorna a string mais longa\nfn longest<'a>(x: &'a str, y: &'a str) -> &'a str {\n    if x.len() > y.len() { x } else { y }\n}\n\nfn main() {\n    let s1 = String::from("longa");\n    let result;\n    {\n        let s2 = String::from("curta");\n        result = longest(&s1, &s2); // ok\n    }\n    // println!("{}", result); // Erro: s2 morreu\n}\n
\n\n

Pergunta: O que é "elision de lifetime"?

\n\n

Resposta: O compilador adiciona automaticamente anotações de lifetime em casos simples. Por exemplo, para o método fn first_word(s: &str) -> &str, o compilador entende que o lifetime de saída é igual ao de entrada. A elision funciona com base em três regras descritas no livro do Rust.

\n\n

3. Unsafe Rust e macros

\n\n

Pergunta: Quando é justificado o uso de unsafe? Quais operações estão disponíveis apenas dentro de blocos unsafe?

\n\n

Resposta: unsafe é usado para operações que o compilador não pode verificar: desreferenciar ponteiros brutos, chamar funções externas (FFI), acessar variáveis estáticas mutáveis e implementar traits inseguros. No entanto, unsafe n

Blogs

Book Recommendations