Bird
Raised Fist0
Rustprogramming~20 mins

RefCell overview in Rust - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
RefCell Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2: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());
}
A
First borrow: 5
Modified inside borrow_mut: 15
Final value: 15
B
First borrow: 5
Modified inside borrow_mut: 10
Final value: 10
C
First borrow: 5
Modified inside borrow_mut: 15
Final value: 5
DCompilation error due to multiple borrows
Attempts:
2 left
💡 Hint
Remember that borrow() gives an immutable reference and borrow_mut() gives a mutable reference, but they cannot coexist.
🧠 Conceptual
intermediate
2: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(); }
Acompile-time borrow checker error
Bpanic at runtime: already borrowed
Cno error, runs fine
Dsyntax error
Attempts:
2 left
💡 Hint
RefCell enforces borrowing rules at runtime, not compile time.
🔧 Debug
advanced
2: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); }
ANo panic, code runs fine
BCannot push to vector inside RefCell
CImmutable borrow is dropped too early
DMutable borrow while immutable borrow is active causes panic
Attempts:
2 left
💡 Hint
Check the order and lifetime of borrows.
📝 Syntax
advanced
2:00remaining
Which option correctly creates a RefCell with initial value 42?
Choose the correct Rust code to create a RefCell holding the integer 42.
Alet cell = RefCell::new(42);
Blet cell = RefCell(42);
Clet cell = RefCell::create(42);
Dlet cell = new RefCell(42);
Attempts:
2 left
💡 Hint
Use the standard constructor method for RefCell.
🚀 Application
expert
3: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()); }
A2
B3
C4
DCompilation error
Attempts:
2 left
💡 Hint
Each mutable borrow adds one element to the vector.

Practice

(1/5)
1. What is the main purpose of RefCell in Rust?
easy
A. To enable safe sharing of data across multiple threads
B. To enforce borrowing rules at compile time
C. To replace all uses of Box for heap allocation
D. To allow mutation of data even when the data is borrowed immutably

Solution

  1. Step 1: Understand RefCell's role

    RefCell allows mutation of data even when it is borrowed immutably by enforcing borrowing rules at runtime.
  2. Step 2: Compare with other options

    RefCell is not for multi-threading (that's for Mutex or RwLock), nor does it replace Box or enforce compile-time checks.
  3. Final Answer:

    To allow mutation of data even when the data is borrowed immutably -> Option D
  4. Quick Check:

    RefCell enables interior mutability = B [OK]
Hint: RefCell allows changing data inside immutable references [OK]
Common Mistakes:
  • Confusing RefCell with thread-safe types
  • Thinking RefCell enforces compile-time checks
  • Assuming RefCell replaces Box for heap allocation
2. Which of the following is the correct way to create a RefCell containing an integer value 10?
easy
A. let x = RefCell::create(10);
B. let x = RefCell(10);
C. let x = RefCell::new(10);
D. let x = new RefCell(10);

Solution

  1. Step 1: Recall RefCell creation syntax

    RefCell is created using the associated function new like RefCell::new(value).
  2. Step 2: Check options

    Only let x = RefCell::new(10); uses the correct syntax. Options A, B, and D are invalid Rust syntax for RefCell creation.
  3. Final Answer:

    let x = RefCell::new(10); -> Option C
  4. Quick Check:

    Use RefCell::new(value) to create [OK]
Hint: Use RefCell::new(value) to create a RefCell [OK]
Common Mistakes:
  • Using RefCell(10) without ::new
  • Trying to call RefCell::create which doesn't exist
  • Using new RefCell(10) like other languages
3. What will be the output of this Rust code?
use std::cell::RefCell;

fn main() {
    let data = RefCell::new(5);
    *data.borrow_mut() += 10;
    println!("{}", data.borrow());
}
medium
A. 15
B. 5
C. Compilation error
D. Runtime panic

Solution

  1. Step 1: Understand the code behavior

    The RefCell holds 5 initially. The mutable borrow adds 10, changing the value to 15.
  2. Step 2: Print the current value

    The immutable borrow prints the updated value, which is 15.
  3. Final Answer:

    15 -> Option A
  4. Quick Check:

    RefCell allows mutation inside borrow_mut = 15 [OK]
Hint: borrow_mut lets you change the value inside RefCell [OK]
Common Mistakes:
  • Expecting original value 5 to print
  • Thinking borrow_mut causes compile error
  • Confusing borrow() and borrow_mut() usage
4. What error occurs when you try to borrow a RefCell mutably twice at the same time?
use std::cell::RefCell;

fn main() {
    let cell = RefCell::new(10);
    let mut1 = cell.borrow_mut();
    let mut2 = cell.borrow_mut();
}
medium
A. Runtime panic due to multiple mutable borrows
B. Syntax error: borrow_mut() not found
C. No error, code runs fine
D. Compile-time borrow checker error

Solution

  1. Step 1: Understand RefCell borrowing rules

    RefCell enforces borrowing rules at runtime, so multiple mutable borrows cause a panic at runtime.
  2. Step 2: Analyze the code

    Two mutable borrows happen simultaneously, which is forbidden and triggers a runtime panic.
  3. Final Answer:

    Runtime panic due to multiple mutable borrows -> Option A
  4. Quick Check:

    RefCell panics on multiple mutable borrows [OK]
Hint: Only one mutable borrow allowed at runtime in RefCell [OK]
Common Mistakes:
  • Expecting compile-time error instead of runtime panic
  • Thinking multiple mutable borrows are allowed
  • Confusing syntax errors with borrowing errors
5. You want to safely mutate a value inside a struct shared only within one thread. Which is the best way to do this using RefCell?
struct Counter {
    count: RefCell<i32>,
}

impl Counter {
    fn new() -> Self {
        Counter { count: RefCell::new(0) }
    }

    fn increment(&self) {
        // Fill in this method
    }
}
What code should replace the comment to increment the count safely?
hard
A. self.count = RefCell::new(*self.count.borrow() + 1);
B. *self.count.borrow_mut() += 1;
C. self.count.borrow() += 1;
D. self.count += 1;

Solution

  1. Step 1: Understand how to mutate RefCell inside a method

    To change the value inside RefCell, we borrow it mutably with borrow_mut() and then modify the dereferenced value.
  2. Step 2: Check each option

    *self.count.borrow_mut() += 1; correctly mutably borrows and increments. self.count = RefCell::new(*self.count.borrow() + 1); tries to replace the RefCell which is not allowed. self.count.borrow() += 1; tries to mutate an immutable borrow. self.count += 1; tries to add directly to RefCell which is invalid.
  3. Final Answer:

    *self.count.borrow_mut() += 1; -> Option B
  4. Quick Check:

    Use borrow_mut() to mutate RefCell value [OK]
Hint: Use *borrow_mut() to change RefCell's inner value [OK]
Common Mistakes:
  • Trying to assign a new RefCell instead of mutating inside
  • Using borrow() instead of borrow_mut() for mutation
  • Trying to add directly to RefCell without borrowing
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard