Challenge - 5 Problems
RefCell Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate2:00remaining
What is the output of this RefCell borrow example?
Consider this Rust code using
RefCell. What will it print?Rust
use std::cell::RefCell;
fn main() {
let data = RefCell::new(5);
{
let borrow1 = data.borrow();
println!("First borrow: {}", *borrow1);
}
{
let mut borrow2 = data.borrow_mut();
*borrow2 += 10;
println!("Modified inside borrow_mut: {}", *borrow2);
}
println!("Final value: {}", data.borrow());
}Attempts:
2 left
💡 Hint
Remember that
borrow() gives an immutable reference and borrow_mut() gives a mutable reference, but they cannot coexist.✗ Incorrect
The first borrow prints 5. Then the mutable borrow adds 10, making the value 15. The final print shows 15.
🧠 Conceptual
intermediate2:00remaining
What error occurs when borrowing RefCell incorrectly?
What error will this Rust code produce when run?
use std::cell::RefCell;
fn main() {
let data = RefCell::new(10);
let _borrow1 = data.borrow();
let _borrow2 = data.borrow_mut();
}
Attempts:
2 left
💡 Hint
RefCell enforces borrowing rules at runtime, not compile time.
✗ Incorrect
RefCell allows multiple immutable borrows or one mutable borrow. Borrowing mutably while immutable borrow exists causes a runtime panic.
🔧 Debug
advanced2:00remaining
Why does this RefCell code panic at runtime?
Identify the cause of the runtime panic in this code:
use std::cell::RefCell;
fn main() {
let data = RefCell::new(vec![1, 2, 3]);
let borrow1 = data.borrow();
data.borrow_mut().push(4);
println!("{:?}", borrow1);
}
Attempts:
2 left
💡 Hint
Check the order and lifetime of borrows.
✗ Incorrect
The immutable borrow
borrow1 is still active when borrow_mut() is called, causing a runtime panic.📝 Syntax
advanced2:00remaining
Which option correctly creates a RefCell with initial value 42?
Choose the correct Rust code to create a RefCell holding the integer 42.
Attempts:
2 left
💡 Hint
Use the standard constructor method for RefCell.
✗ Incorrect
RefCell is created with RefCell::new(value). Other options are invalid syntax or methods.
🚀 Application
expert3:00remaining
How many items are in the vector after this RefCell code runs?
What is the length of the vector inside RefCell after this code executes?
use std::cell::RefCell;
fn main() {
let data = RefCell::new(vec![1, 2]);
{
let mut borrow_mut = data.borrow_mut();
borrow_mut.push(3);
}
{
let borrow = data.borrow();
println!("Vector contents: {:?}", *borrow);
}
{
let mut borrow_mut = data.borrow_mut();
borrow_mut.push(4);
}
println!("Length: {}", data.borrow().len());
}
Attempts:
2 left
💡 Hint
Each mutable borrow adds one element to the vector.
✗ Incorrect
Two mutable borrows add 3 and 4 to the vector, starting from [1, 2], so length is 4.