The amateur programmer
The amateur programmer

Reputation: 1308

How to get mutable reference to object inside vec inside a struct in rust?

I have a very basic problem in a rust relating to mutability of objects inside a vector. I have a need to get a mutable reference to an object from within a method of the struct as follows:

struct Allocator {
    free_regions: Vec<Region>, // vec of free regions
    used_regions: Vec<Region>, // vec of used regions
}
fn alloc(&self, layout: Layout) -> ! {
    //I want to get this mutable reference in order to avoid copying large amount of data around
    let region: &mut Region = self.free_regions.get_mut(index).expect("Could not get region");
    //This fails with  `self` is a `&` reference, so the data it refers to cannot be borrowed as mutable
}

I cannot change the function to use &mut self because this requirement is forced by a trait I'm trying to implement here. What is a proper way to get around this kind of issue? I need to be able to modify the data in those regions inside the Vec in the struct.

Upvotes: 2

Views: 611

Answers (1)

Oussama Gammoudi
Oussama Gammoudi

Reputation: 761

You need to use RefCell, or Mutex if it is shared between threads

struct Allocator {
    free_regions: RefCell<Vec<Region>>, // vec of free regions
    used_regions: RefCell<Vec<Region>>, // vec of used regions
}
fn alloc(&self, layout: Layout) -> ! {
    //I want to get this mutable reference in order to avoid copying large amount of data around
    let region: &mut Region = self.free_regions.borrow_mut().get_mut(index).expect("Could not get region");
    //This fails with  `self` is a `&` reference, so the data it refers to cannot be borrowed as mutable
}

You can find more info here https://doc.rust-lang.org/book/ch15-05-interior-mutability.html

Upvotes: 2

Related Questions