Skip to content

Instantly share code, notes, and snippets.

@kkolyan
Created December 12, 2021 20:24
Show Gist options
  • Save kkolyan/8a7b52ce7d69e60382109f2f5a89c7a3 to your computer and use it in GitHub Desktop.
Save kkolyan/8a7b52ce7d69e60382109f2f5a89c7a3 to your computer and use it in GitHub Desktop.
use std::cell::RefCell;
use std::rc::{Rc, Weak};
struct Node {
name: String,
}
struct Engine {
selected_node: Option<Weak<RefCell<Node>>>,
}
impl Engine {
fn new() -> Self {
return Engine { selected_node: None };
}
}
impl Node {
fn new(name: &str) -> Self {
return Node { name: name.to_string() };
}
}
trait SomeActionMaker<T> {
fn do_some_action(&self, engine: &mut Engine);
}
impl SomeActionMaker<Rc<RefCell<Node>>> for Rc<RefCell<Node>> {
fn do_some_action(&self, engine: &mut Engine) {
engine.selected_node = Some(Rc::downgrade(self));
}
}
fn main() {
let mut engine = Engine::new();
let a = Rc::from(RefCell::from(Node::new("sharik")));
a.do_some_action(&mut engine);
assert_eq!(
engine.selected_node
.expect("none selected")
.upgrade()
.expect("sharik is dead")
.borrow_mut().name,
"sharik"
);
println!("Ok")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment