Discover why mixing up expressions and statements can silently break your Rust code!
Expression vs statement in Rust - When to Use Which
Imagine writing a program where you have to do calculations and also perform actions like printing results. You try to write everything as commands, but some parts need to produce values while others just do things. Without understanding the difference, your code gets confusing and buggy.
When you mix up expressions and statements, your code can become slow to write and hard to fix. You might try to use a command where a value is expected, or vice versa, causing errors that waste time and patience.
Knowing the difference between expressions (which produce values) and statements (which perform actions) helps you write clear, correct code. You can combine them smartly to make your program both efficient and easy to read.
let x = 5; println!("x is {}", x);
let x = { 5 + 3 };
println!("x is {}", x);This understanding lets you write concise and powerful Rust code that flows naturally and avoids common mistakes.
When calculating a total price in a shopping app, expressions let you compute the sum, while statements let you show the result or update the screen.
Expressions produce values you can use.
Statements perform actions but don't return values.
Knowing both helps write better Rust programs.
Practice
expression?Solution
Step 1: Understand what an expression does
An expression in Rust always produces a value when evaluated.Step 2: Compare with statements
Statements perform actions but do not return values, unlike expressions.Final Answer:
It calculates a value and returns it. -> Option AQuick Check:
Expression = returns value [OK]
- Confusing statements with expressions
- Thinking expressions do not return values
- Assuming all code lines are statements
Solution
Step 1: Identify statements vs expressions
Statements perform actions and often end with a semicolon, like variable declarations.Step 2: Check each option
let x = 5; declares a variable and ends with a semicolon, so it's a statement. Options A and C are expressions without semicolons. println!("Hello") is a macro call but without a semicolon, so it's an expression.Final Answer:
let x = 5; -> Option AQuick Check:
Statements end with semicolon [OK]
- Missing semicolon for statements
- Confusing macro calls without semicolon as statements
- Thinking expressions are statements
fn main() {
let x = 3;
let y = {
let z = x + 2;
z * 2
};
println!("{}", y);
}Solution
Step 1: Evaluate the inner block expression
Inside the block, z = x + 2 = 3 + 2 = 5, then the block returns z * 2 = 5 * 2 = 10.Step 2: Assign and print the value
Variable y gets the value 10, which is printed by println!.Final Answer:
10 -> Option BQuick Check:
Block expression returns 10 [OK]
- Assuming block returns unit () due to semicolon confusion
- Miscomputing z or y values
- Thinking println! returns a value
fn main() {
let x = 5;
let y = if x > 3 {
x + 1;
} else {
x - 1
};
println!("{}", y);
}Solution
Step 1: Analyze the if expression branches
The if branch hasx + 1;with a semicolon, making it a statement returning unit (). The else branch returnsx - 1without semicolon, an expression returning i32.Step 2: Understand type mismatch
Because branches return different types (unit vs i32), Rust reports a type mismatch error for y.Final Answer:
The if block returns unit type, causing a type mismatch -> Option CQuick Check:
If branches must return same type [OK]
- Adding semicolon after expressions in if branches
- Ignoring type mismatch errors
- Assuming println! causes error
result to the value of a block that adds 2 to n only if n is positive, otherwise returns 0. Which code correctly uses expressions and statements?Solution
Step 1: Check if expressions return values
Options A and D both return values correctly. let result = if n > 0 { n + 2; } else { 0; }; has semicolons inside if branches, making them statements returning unit (). let result = if n > 0 { n + 2 } else { println!("Zero") };'s else branch calls println! which returns unit (), causing type mismatch.Step 2: Compare A and D
let result = if n > 0 { n + 2 } else { 0 }; assigns directly from if expression. let result = { if n > 0 { n + 2 } else { 0 } }; wraps the if expression inside a block, which is also an expression returning the if's value. Both are valid, but let result = { if n > 0 { n + 2 } else { 0 } }; explicitly shows block expression usage.Final Answer:
let result = { if n > 0 { n + 2 } else { 0 } }; -> Option DQuick Check:
Block expression returns if expression value [OK]
- Adding semicolons inside if branches
- Mixing expressions with statements causing type errors
- Using println! where a value is expected
Ready to prove it?
Pass the test and this pattern moves unknown
