Rust - HashMap - 구조체의 메소드를 value로 사용하기

1

아래 코드는 페이스북의 한국 러스트 사용자 그룹에서 내가 올린 질문에 김지현님이 올린 답글이다 Permalink to the playground

use std::collections::HashMap;

pub struct MyType { /* ... */ }

impl MyType {
    fn new() -> Self {
        MyType { /* ... */ }
    }
    
    fn foo(&mut self) { /* ... */ }
    fn bar(&mut self) { /* ... */ }
}

fn main() {
    let mut a = MyType::new();
    let mut b = MyType::new();
    
    {
        // map 안에 a b에 대한 포인터가 들어있기때문에,
        // 반드시 map은 a b보다 짧게 살아야함
        let mut map = HashMap::<_, Box<dyn FnMut()>>::new();
        map.insert(0, Box::new(|| a.foo()));
        map.insert(1, Box::new(|| b.bar()));
    }
}


2

한국 러스트 사용자 그룹에서 유은총님이 답변으로 올린 코드를 조금 수정한 것
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=a8713feceb7100ef1430d50d782322e0

use std::collections::HashMap;

#[derive(Default)]
struct Handler {
    hand_map: HashMap<u16, fn(&mut Handler)>,
}

impl Handler {
    fn initialize(&mut self) {
        self.hand_map.insert(11, Handler::request1);
        self.hand_map.insert(12, Handler::request2);
    }

    fn request1(&mut self) {
        println!("request1");
    }

    fn request2(&mut self) {
        println!("request2");
    }
}

fn main() {
    let mut handler = Handler::default();
    handler.initialize();
    
    match handler.hand_map.get_mut(&11u16) {
        Some(func) => func(&mut handler),
        None => ()
    }
}

이 글은 2020-04-28에 작성되었습니다.