String slices let you look at parts of a string without making a new copy. This saves memory and time.
String slices in Rust
let slice = &string[start_index..end_index];
The slice uses & and square brackets with two dots .. between start and end positions.
The start index is included, the end index is excluded (like counting from start up to but not including end).
let s = String::from("hello"); let slice = &s[0..2]; println!("{}", slice);
let s = "world"; let slice = &s[1..4]; println!("{}", slice);
let s = String::from("rustacean"); let slice = &s[..4]; println!("{}", slice);
let s = String::from("rustacean"); let slice = &s[4..]; println!("{}", slice);
This program takes two slices from the greeting string: "Hello" and "world". Then it prints them with a space.
fn main() {
let greeting = String::from("Hello, world!");
let hello = &greeting[0..5];
let world = &greeting[7..12];
println!("{} {}", hello, world);
}String slices must be on valid character boundaries, or Rust will give an error.
String slices are references, so they do not own the data and cannot outlive the original string.
You can also slice string literals directly, like let s = &"hello"[1..4];
String slices let you use parts of a string without copying.
Use &string[start..end] to get a slice from start to end-1.
Slices are fast and memory-friendly because they borrow the original string.
Practice
Solution
Step 1: Understand string slice concept
A string slice is a reference to a part of a string, not a new string.Step 2: Compare options
Only A reference to a part of a string without copying it describes a reference without copying, which matches string slices.Final Answer:
A reference to a part of a string without copying it -> Option BQuick Check:
String slice = reference without copy [OK]
- Thinking slices create new strings
- Confusing slices with string modification
- Believing slices are integer types
text?Solution
Step 1: Recall Rust slice syntax
Rust uses &string[start..end] to get a slice from start to end-1.Step 2: Check options
&text[0..4] uses &text[0..4], which correctly slices first 4 chars (indices 0 to 3).Final Answer:
&text[0..4] -> Option AQuick Check:
Slice syntax = &string[start..end] [OK]
- Using method calls like slice() which don't exist
- Using 1-based indexing instead of 0-based
- Using Python-style slicing with colons
let s = String::from("hello world");
let slice = &s[6..11];
println!("{}", slice);Solution
Step 1: Understand slicing indices
The slice &s[6..11] takes characters from index 6 up to 10 (11 excluded).Step 2: Identify substring
In "hello world", index 6 is 'w' and index 10 is 'd', so slice is "world".Final Answer:
world -> Option DQuick Check:
Slice &s[6..11] = "world" [OK]
- Including the end index character
- Confusing start and end indices
- Expecting full string output
let s = String::from("rustacean");
let slice = &s[0..5];
println!("{}", slice);
let invalid_slice = &s[5..15];Solution
Step 1: Check slice ranges
The string "rustacean" has length 9, so valid indices are 0 to 8.Step 2: Analyze invalid slice
The slice &s[5..15] tries to access indices beyond length, causing runtime panic.Final Answer:
The slice &s[5..15] causes a runtime panic due to out-of-bounds -> Option AQuick Check:
Out-of-bounds slice = panic [OK]
- Assuming slices auto-adjust to string length
- Thinking &s[0..5] is invalid syntax
- Ignoring runtime panics from invalid slices
text, how can you safely get a slice of the first n characters without risking a runtime panic if n is larger than the string length?Solution
Step 1: Understand safe slicing
To avoid panic, slice end must not exceed string length.Step 2: Use min to limit slice end
Using n.min(text.len()) ensures slice end is at most string length.Final Answer:
Use &text[0..n.min(text.len())] -> Option CQuick Check:
Safe slice end = min(n, length) [OK]
- Slicing without length check causing panic
- Using unwrap() which can panic if None
- Using inclusive range which is invalid for slices
Ready to prove it?
Pass the test and this pattern moves unknown
