Step 1 of 5 · Reading · ~3 min
Learn
Strings
Formatting
Rust's formatting machinery has one deeply pleasant property: it's checked at compile time. A wrong placeholder count isn't mangled output at 2 a.m. — it's a build failure at 2 p.m. This lesson makes you fluent in the {} mini-language, because byte-exact output is how every exercise here is graded.
The core
let name = "Alice";
let age = 30;
println!("Hi, {}. You're {}.", name, age); // positional, in order
println!("{0} and {1} and {0} again", "a", "b"); // by index
println!("{name} is {age}", name = name, age = age); // by name
That third form names each argument. Newer Rust (1.58+) goes further and lets {name} pull a variable straight out of scope with no argument list at all — but this course's grader runs an older rustc that rejects it, with error: there is no argument named `name` . It is the single most common compile error in this course. In every exercise here, pass the values as arguments: println!("{} is {}", name, age);.
{} uses the type's Display — its "for humans" rendering. Numbers, strings, chars all have one. Vectors and other data structures deliberately don't — for them you use Debug formatting:
let nums = vec![1, 2, 3];
println!("{:?}", nums); // [1, 2, 3] — Debug: "for programmers"
println!("{:#?}", nums); // pretty, multi-line — the debugging workhorse
{:?} works on almost everything (your own structs join in with one line, #[derive(Debug)], in chapter 5). When you just need to see a value mid-debug, {:?} is the answer; dbg!(expr) goes one better — it prints the file, line, expression text, and value, and hands the value back so you can wrap it around anything inline.
Precision, width, padding
The format spec goes after a colon:
let pi = 3.14159265;
println!("{:.2}", pi); // 3.14 — two decimals (rounds, not truncates)
println!("{:8.2}", pi); // 3.14 — width 8, right-aligned
println!("{:<8.2}|", pi); // 3.14 | — left-aligned
println!("{:08.2}", pi); // 00003.14 — zero-padded
println!("{:>6}", 42); // 42 — width 6 for integers too
println!("{:04}", 7); // 0007
{:.2} is the one to burn in: "two decimal places" appears in graded output formats constantly, and it rounds (3.146 → 3.15). Alignment (< left, > right, ^ center) plus width covers every table you'll ever print.
The whole family, one syntax
Learn the mini-language once, use it in five places:
println!("x = {}", x); // print + newline
print!("no newline"); // print, no newline
let s = format!("({}, {})", x, y); // build a String — the Sprintf of Rust
eprintln!("error: {}", e); // stderr — keeps stdout clean for graders!
panic!("bad state: {}", code); // even panics format
format! replaces every string-gluing + chain you'd otherwise write, and eprintln! matters more than it looks for this course: test graders read stdout only, so debug prints on stderr (eprintln!) don't break your test output. That trick alone will save you a resubmission or three.
Your exercise: Greeting Card
Fixed text with interpolated values, exact spacing, exact newlines. The reliable method: write the expected output literally in a scratch comment, then transcribe it placeholder by placeholder — each {} replacing exactly one value, each line ending where println! ends it. If the grader disagrees with output that "looks identical," print it with {:?} once: quotes and escapes make invisible whitespace visible, and the diff explains itself.
Discussion
Ask a question, share an insight, or help someone who’s stuck.
Sign in to post a comment or reply.
Loading…