Skip to content

Instantly share code, notes, and snippets.

@octave99
Created June 27, 2019 13:44
Show Gist options
  • Save octave99/62f1ab4267ef233475a692f8b32a46e2 to your computer and use it in GitHub Desktop.
Save octave99/62f1ab4267ef233475a692f8b32a46e2 to your computer and use it in GitHub Desktop.
#[derive(Clone, Copy)]
pub struct MyStruct<'a> {
name: &'a str,
}
impl<'a> MyStruct<'a> {
fn new() -> Self {
MyStruct { name: "Before" }
}
fn read(&self) {
print!("Value is {}\n", self.name);
}
fn write(&mut self) {
self.name = "After";
print!("Value is now {}\n", self.name);
}
}
fn error_fn() {
let mut ms = MyStruct::new();
let reader = &ms;
reader.read();
// let mut _writer = &mut ms; // Error: cannot borrow `ms` as mutable because it is also borrowed as immutable
}
fn good_fn() {
let mut ms = MyStruct::new();
{
let reader = &ms;
reader.read();
}
{
let mut _writer = &mut ms;
_writer.write();
}
{
let reader = &ms;
reader.read();
}
}
fn cell_fn() {
let mut c = std::cell::Cell::new(MyStruct::new());
c.get().read();
c.get_mut().write();
c.get().read();
c.get_mut().write();
}
fn main() {
error_fn();
cell_fn();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment