Rust provides powerful abstractions for managing memory safely and efficiently. One such abstraction is Rc
(Reference Counting), which allows multiple ownership of data. When combined with RefCell
, it unlocks the ability to mutate data through shared ownership safely at runtime.
In this challenge, you'll use Rc
and RefCell
together to explore the concept of Interior Mutability in Rust.
Implement the following functions to demonstrate shared ownership and interior mutability:
push
:
Rc<RefCell<Vec<T>>>
as input.RefCell
.iterate_and_print_shared_data
:
Rc<RefCell<Vec<T>>>
as input.plus_one
:
Rc<RefCell<i32>
as input.RefCell
by one.Rc
to share ownership of the vector.RefCell
to allow interior mutability.If you're stuck, here are some hints to help you solve the challenge:
Rc::clone
to share ownership of the vector.RefCell
's .borrow_mut()
for mutable access and .borrow()
for immutable access.T: Display
is needed to format the output with println!
.use std::cell::RefCell;use std::rc::Rc;use std::fmt::Display;pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { // 1. Borrow the vector mutably and push the element data.borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T>(data: Rc<RefCell<Vec<T>>>) where T: Display, // Ensure T can be printed{ // 2. Borrow the data and print each item for item in data.borrow().iter() { println!("{}", item); }}pub fn plus_one(data: Rc<RefCell<i32>>) { // 3. Borrow the data mutably and increment the value *data.borrow_mut() += 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::rc::Rc;use core::fmt::Display;pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T)where T : Display { data.borrow_mut().push(element); // 1. Finish the function}pub fn iterate_and_print_shared_data<T>(data: Rc<RefCell<Vec<T>>>)where T: Display{ // 2. Borrow the data and print each item data.borrow().iter().for_each(|element| println!("{}", element));}pub fn plus_one(data: Rc<RefCell<i32>>) { // 3. Finish the function *data.borrow_mut() += 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::rc::Rc;use std::fmt::Display;pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { data.borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T: Display>(data: Rc<RefCell<Vec<T>>>) { data.borrow().iter().for_each(|e| println!("{}", e));}pub fn plus_one(data: Rc<RefCell<i32>>) { *data.borrow_mut() += 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::rc::Rc;use std::fmt::Display;pub fn update_shared_data<T>(data: Rc<RefCell<Vec<T>>>, element: T) { // 1. Finish the function data.borrow_mut().push(element);}pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { // 1. Finish the function data.borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T : Display>(data: Rc<RefCell<Vec<T>>>) { // 2. Borrow the data and print each item for item in data.borrow().iter() { println!("{}", item); }}pub fn plus_one(data: Rc<RefCell<i32>>) { // 3. Finish the function let mut item = data.borrow_mut(); *item = *item + 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::rc::Rc;use std::fmt::Display;pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { // 1. Finish the function data.borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T>(data: Rc<RefCell<Vec<T>>>) where T: Display{ // 2. Borrow the data and print each item for el in data.borrow().iter() { println!("{}", el) } }pub fn plus_one(data: Rc<RefCell<i32>>) { // 3. Finish the function *data.borrow_mut() += 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::rc::Rc;use std::fmt::Display;pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { data.borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T>(data: Rc<RefCell<Vec<T>>>) where T: Display,{ // 2. Borrow the data and print each item for element in data.borrow().iter() { println!("{}", element); }}pub fn plus_one(data: Rc<RefCell<i32>>) { // 3. Finish the function *data.borrow_mut() += 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::rc::Rc;use std::fmt::Display;pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { // 1. Finish the function data.borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T>(data: Rc<RefCell<Vec<T>>>) where T: Display { // 2. Borrow the data and print each item for item in data.borrow().iter() { println!("{}", item); }}pub fn plus_one(data: Rc<RefCell<i32>>) { // 3. Finish the function *data.borrow_mut() += 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::rc::Rc;pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { // 1. Finish the function data.borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T: std::fmt::Display>(data: Rc<RefCell<Vec<T>>>) { // 2. Borrow the data and print each item data.borrow().iter().for_each(|x| { println!("{}", x); });}pub fn plus_one(data: Rc<RefCell<i32>>) { // 3. Finish the function *data.borrow_mut() += 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::rc::Rc;pub fn update_shared_data<T>(data: Rc<RefCell<Vec<T>>>, element: T) { // 1. Finish the function data.borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T: std::fmt::Display>(data: Rc<RefCell<Vec<T>>>) { // 2. Borrow the data and print each item data.borrow().iter().for_each(|x| println!("{}", x));}pub fn plus_one(data: Rc<RefCell<i32>>) { // 3. Finish the function *data.borrow_mut() +=1;}pub fn push(data: Rc<RefCell<Vec<i32>>>, element: i32) { data.borrow_mut().push(element);}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::rc::Rc;pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { // 1. Finish the function let mut x = data.borrow_mut(); x.push(element);}pub fn iterate_and_print_shared_data<T: std::fmt::Display>(data: Rc<RefCell<Vec<T>>>) { // 2. Borrow the data and print each item for d in data.borrow().iter() { println!("{}", d); }}pub fn plus_one(data: Rc<RefCell<i32>>) { // 3. Finish the function let mut x = data.borrow_mut(); *x += 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::rc::Rc;pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { // 1. Finish the function let mut x = data.borrow_mut(); x.push(element);}pub fn iterate_and_print_shared_data<T: std::fmt::Display>(data: Rc<RefCell<Vec<T>>>) { // 2. Borrow the data and print each item for d in data.borrow().iter() { println!("{}", d); }}pub fn plus_one(data: Rc<RefCell<i32>>) { // 3. Finish the function let mut x = data.borrow_mut(); *x += 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::rc::Rc;pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { // 1. Finish the function let mut x = data.borrow_mut(); x.push(element);}pub fn iterate_and_print_shared_data<T: std::fmt::Display>(data: Rc<RefCell<Vec<T>>>) { // 2. Borrow the data and print each item for d in data.borrow().iter() { println!("{}", d); }}pub fn plus_one(data: Rc<RefCell<i32>>) { // 3. Finish the function let mut x = data.borrow_mut(); *x += 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::rc::Rc;use std::fmt::Display;pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { // 1. Finish the function data.borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T>(data: Rc<RefCell<Vec<T>>>) where T: Display{ // 2. Borrow the data and print each item for d in data.borrow().iter() { println!("{}", d); }}pub fn plus_one(data: Rc<RefCell<i32>>) { *data.borrow_mut() += 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::fmt::{Debug, Display};use std::ops::DerefMut;use std::rc::Rc;pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { data.borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T>(data: Rc<RefCell<Vec<T>>>)where T: Display + Debug,{ data.borrow().iter().for_each(|i| println!("{}", i));}pub fn plus_one(data: Rc<RefCell<i32>>) { // 3. Finish the function *data.borrow_mut().deref_mut() += 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::rc::Rc;use std::fmt::Display;pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { // 1. Finish the function data.borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T: Display>(data: Rc<RefCell<Vec<T>>>) { // 2. Borrow the data and print each item for i in data.borrow().iter(){ println!("{}",*i); }}pub fn plus_one(data: Rc<RefCell<i32>>) { // 3. Finish the function *data.borrow_mut()+=1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::rc::Rc;pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { // 1. Finish the function data.borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T: std::fmt::Display>(data: Rc<RefCell<Vec<T>>>) { // 2. Borrow the data and print each item for line in data.borrow().iter() { println!("{}", line.to_string()); }}pub fn plus_one(data: Rc<RefCell<i32>>) { // 3. Finish the function let mut value = data.borrow_mut(); *value += 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::fmt::Display;use std::rc::Rc;pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { data.borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T: Display>(data: Rc<RefCell<Vec<T>>>) { for elem in data.borrow().iter() { println!("{}", elem); }}pub fn plus_one(data: Rc<RefCell<i32>>) { *data.borrow_mut() += 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::fmt::Display;use std::rc::Rc;pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { // 1. Finish the function data.borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T: Display>(data: Rc<RefCell<Vec<T>>>) { // 2. Borrow the data and print each item for item in data.borrow().iter() { println!("{}", item); }}pub fn plus_one(data: Rc<RefCell<i32>>) { *data.borrow_mut() += 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::rc::Rc;pub fn push<T> (data: Rc<RefCell<Vec<T>>>, element: T) where T: std::fmt::Display { let mut arr = data.borrow_mut(); arr.push(element);}pub fn iterate_and_print_shared_data<T>(data: Rc<RefCell<Vec<T>>>) where T: std::fmt::Display { for o in data.borrow().iter() { println!("{}", o); }}pub fn plus_one(data: Rc<RefCell<i32>>) { let mut num = data.borrow_mut(); *num += 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::rc::Rc;pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { data.borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T: std::fmt::Display>(data: Rc<RefCell<Vec<T>>>) { data.borrow().iter().for_each(|x| println!("{}", x));}pub fn plus_one(data: Rc<RefCell<i32>>) { *(data.borrow_mut()) += 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::fmt::Display;use std::rc::Rc;pub fn update_shared_data<T>(data: Rc<RefCell<Vec<T>>>, element: T) { data.borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T>(data: Rc<RefCell<Vec<T>>>)where T: Display,{ data.borrow_mut().iter().for_each(|x| println!("{}", x));}pub fn plus_one(data: Rc<RefCell<i32>>) { *data.borrow_mut() += 1}pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { update_shared_data(data, element);}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::fmt::Display;use std::rc::Rc;pub fn update_shared_data<T>(data: Rc<RefCell<Vec<T>>>, element: T) { data.borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T>(data: Rc<RefCell<Vec<T>>>) where T: Display { data.borrow().iter().for_each(|x| println!("{}", x))}pub fn plus_one(data: Rc<RefCell<i32>>) { *data.borrow_mut() += 1;}pub fn push<T>(data: Rc<RefCell<Vec<T>>>, item: T) { update_shared_data(Rc::clone(&data), item)}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::rc::Rc;use std::fmt::Display;pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { data.borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T: Display>(data: Rc<RefCell<Vec<T>>>) { data.borrow().iter().for_each(|item| println!("{item}"));}pub fn plus_one(data: Rc<RefCell<i32>>) { *(data.borrow_mut()) += 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::rc::Rc;// this function definition was wrong out of the box// pub fn update_shared_data<T>(data: Rc<RefCell<Vec<T>>>, element: T) {pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { // 1. Finish the function data.borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T: std::fmt::Display>(data: Rc<RefCell<Vec<T>>>) { // 2. Borrow the data and print each item data.borrow().iter().for_each(|i| println!("{i}"));}pub fn plus_one(data: Rc<RefCell<i32>>) { // 3. Finish the function *data.borrow_mut() += 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::rc::Rc;use std::fmt::Display;pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { (*data).borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T: Display>(data: Rc<RefCell<Vec<T>>>) { (*data).borrow().iter().for_each(|x| { println!("{x}");});}pub fn plus_one(data: Rc<RefCell<i32>>) { *(*data).borrow_mut() += 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::fmt::Display;use std::rc::Rc;pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { // 1. Finish the function data.borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T: Display>(data: Rc<RefCell<Vec<T>>>) { // 2. Borrow the data and print each item data.borrow().iter().for_each(|d| { println!("{d}"); });}pub fn plus_one(data: Rc<RefCell<i32>>) { // 3. Finish the function *data.borrow_mut() += 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::ops::Add;use std::rc::Rc;pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { // 1. Finish the function data.borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T>(data: Rc<RefCell<Vec<T>>>) where T: std::fmt::Display{ // 2. Borrow the data and print each item data.borrow().iter().for_each(|d| println!("{}", d));}pub fn plus_one(data: Rc<RefCell<i32>>) { // 3. Finish the function let mut borrowed = data.borrow_mut(); *borrowed = borrowed.add(1);}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}
use std::cell::RefCell;use std::rc::Rc;use std::fmt::Display;pub fn push<T>(data: Rc<RefCell<Vec<T>>>, element: T) { // 1. Finish the function data.borrow_mut().push(element);}pub fn iterate_and_print_shared_data<T:Display>(data: Rc<RefCell<Vec<T>>>) { // 2. Borrow the data and print each item data.borrow().iter().for_each(|element| { println!("{}", element); })}pub fn plus_one(data: Rc<RefCell<i32>>) { // 3. Finish the function let mut cell = data.borrow_mut(); *cell += 1;}// Example usagepub fn main() { let shared_data = Rc::new(RefCell::new(vec![1, 2, 3])); // Updating shared data push(Rc::clone(&shared_data), 4); push(Rc::clone(&shared_data), 5); // Iterating and printing shared data println!("Shared Data:"); iterate_and_print_shared_data(Rc::clone(&shared_data)); let my_num = Rc::new(RefCell::new(5)); plus_one(Rc::clone(&my_num)); assert_eq!(*my_num.borrow(), 6, "Value was not incremented correctly.");}