ProAdvancedInterview prep

Rust Interview Questions

The questions a Rust interview actually turns on: where a value's owner is at each line, why two borrows that look disjoint are not, and what a lifetime annotation promises and what it cannot. Ownership and moves, aliasing, lifetimes, String against &str, Vec against slices, Option and Result, traits and dispatch, monomorphisation, Rc and RefCell, and what makes a type safe to send between threads.

Questions90
Topics10
Answering time68 minutes
At five a day18 days
LevelAdvanced

Who it is for

Preparing, and short of time.

For someone confident in the language who wants the traps, the edge cases and the interview questions.

You will get the most out of it if you have written Rust recently enough to read it without effort, and have been surprised by it at least once. If you are picking the language up for the first time, start with Rust Essentials and come back to this one.

It is also built for interview preparation: the questions are the ones that get asked because they separate people who have read the documentation from people who have hit the behaviour in production.

How long it takes

90 graded questions at roughly 45 seconds each is about 68 minutes of answering in total.

At the default five questions a day, and because the session mixes in your other courses, expect around 18 days — call it 3 weeks — to see everything once, plus a few weeks of thinning reviews after that before it is all mastered.

A question is mastered on the third correct answer, once the gap between reviews has grown past a week — so a course cannot be finished in a weekend however long you sit with it.

Question mix

  • 60 multiple choice
  • 10 concept cards
  • 10 predict the output
  • 10 put it in order
  • 10 matching questions

Syllabus

What you will be asked about

  1. 01

    Ownership and Moves

    Say who owns a value at each line, and which later uses the move rules have already ruled out.

  2. 02

    Borrowing and Aliasing

    Apply the aliasing rule to code that looks safe, and name the bug each rejection prevents.

  3. 03

    Lifetimes Without Hand-Waving

    Read a lifetime annotation as a relationship between references rather than as a duration.

  4. 04

    String and &str

    Choose between an owned String and a borrowed &str, and say what each choice costs the caller.

  5. 05

    Vec, Arrays and Slices

    Choose between Vec, array and slice in a signature, and say what each costs the caller.

  6. 06

    Option and Result

    Use Option and Result where other languages use null and exceptions, and say what the compiler gains by it.

  7. 07

    Traits and Dispatch

    Say what a trait gives you that an interface does not, and choose between static and dynamic dispatch.

  8. 08

    Generics and Monomorphisation

    Say what the compiler does with a generic function, and what that costs in binary size and compile time.

  9. 09

    Box, Rc and RefCell

    Choose between Box, Rc and RefCell, and say which check each one moves to run time.

  10. 10

    Send, Sync and Thread Safety

    Say what makes a type safe to move or share between threads, and who decides that it is.

8 more topics, and all 90 questions

Rust Interview Questions is a Pro course. One subscription opens it and every other course in the catalogue, including the ones still being written.

See pricing Find a free course

A question from this course

Ownership and Moves

What happens when this is compiled?

fn main() {
    let v = vec![String::from("a")];
    let s = v[0];
    println!("{}", s);
}
  • AIt does not compile: indexing borrows the Vec, and a String cannot be moved out of it
  • Ba
  • CIt does not compile: a Vec cannot be indexed with a literal 0
  • DIt compiles, and the Vec is left holding an empty String
Show the answer

A It does not compile: indexing borrows the Vec, and a String cannot be moved out of it

v[0] is a place expression, not a value, so the assignment tries to move a String out of memory the Vec still owns - rustc reports E0507, cannot move out of index. You may have expected the Vec to give the element up; it cannot, because it would then have a hole in it. Use &v[0], v[0].clone() or v.remove(0) depending on what you actually meant.

The rest of the track

Rust at every depth

FreeFoundation

Rust Essentials

The model underneath the syntax. Assigning a String to a second name moves it and the first name stops working, while an i32 is simply copied; borrowing, Option and exhaustive match are the same compiler insisting you say what happens in every case.

90 questions · 68 minutes

ProCore

Rust Core

The compiler's side of the argument, made explicit. A lifetime constrains how long a borrow may be used rather than naming a span of time, an iterator chain does nothing at all until something consumes it, and a trait bound is the only thing a generic function is allowed to assume.

90 questions · 68 minutes

ProCore

Rust Data & Collections

The containers people reach for daily and the places they bite: indexing that panics where get() hands back None, a borrow that freezes the Vec it came from, and an entry() call that writes when you only meant to read. Every snippet here runs, so the answers are what rustc really printed.

90 questions · 68 minutes

ProCoreInterview prep

Rust Errors & Edge Cases

Failure as a value rather than an exception: Option where there is nothing to say and Result where there is, the ? operator and the From impl it quietly needs, custom error enums, Display against Debug, and the line between an error a caller can act on and a panic that ends the process. Every snippet here either runs or refuses to compile for a reason you can name.

90 questions · 68 minutes

ProCore

Rust Standard Library

The parts of std that people reimplement by hand: the String and &str split, chars against bytes, the split and trim families, parse and the turbofish, the lazy iterator adaptors, collect into anything that implements FromIterator, the Option and Result combinators, the three sorts, and the Display against Debug distinction. Ten corners where a built-in already does the job and one behaviour in each is not what you assumed.

90 questions · 68 minutes

ProAdvanced

Rust Idioms & Pitfalls

Ten habits that compile and still mark the code as written by someone thinking in another language: the clone that silences the borrow checker, unwrap as punctuation, String parameters where a slice would do, index loops, a collect nobody reads, a five-line match that is one combinator, &Vec in a signature, lifetimes elision would have written, inherent methods that want to be trait impls, and drop misread. Each one is shown working, then shown costing something.

90 questions · 68 minutes

ProAdvancedInterview prep

Rust Advanced

The type system and the borrow checker in earnest: elision that quietly ties a return to &self, two &mut borrows that look disjoint and are not, RefCell panicking at run time where the compiler would have refused. Every snippet here either compiles or fails to for a reason you can name.

90 questions · 68 minutes

ProAdvancedInterview prep

Rust Performance

What a Rust program actually costs, read off the things you can observe: Vec::capacity, strong_count, size_of and the order drops run in. Every claim here is one the snippet proves, which is why none of them is a timing.

90 questions · 68 minutes

ProCore

Rust Testing

What a Rust assertion actually claims, and where that claim is weaker than it looks. assert_eq! and its argument order, should_panic and its substring match, tests that return Result, cfg(test) modules against integration tests, doc tests, floats, and the difference between a failed assertion and a panic somewhere else.

90 questions · 68 minutes

Start Rust Interview Questions
in tomorrow’s session.

Enrol and this course joins your daily five, mixed in with everything else you are studying — 90 questions spread over about 18 days rather than dropped on you at once.

Browse the catalogue