< 返回版块

祐祐 发表于 2024-08-16 23:52

Tags:可变借用,限制,语法,struct,闭包

救各路大神解答,

目的:我想要做一个解释器,有一个需求就是要从 rust 中的函数绑掉到给解释器用,作为解释器的全域上下文。

问题:我想要让从cx 捞出来的target_func 可以在将cx 传入target_func 作为其上下文,但是我怎实现都做不出来,请问下面这段程式怎么让编译通过。

use std::collections::HashMap;

struct Content {
    pub data: i32,
    pub map_env_fun: HashMap<String, EnvFunction>,
}
impl Content {
    fn new() -> Self {
        Content {
            data: 0,
            map_env_fun: HashMap::new(),
        }
    }
}

type BoxFnMut = Box<dyn FnMut(&mut Content) -> bool>;

enum EnvFunction {
    Func(BoxFnMut),
}

fn __fun(cx: &mut Content) -> bool {
    cx.data += 1;
    true
}

fn init_built_in_functions(cx: &mut Content) {
    let fun: BoxFnMut = Box::new(__fun);
    cx.map_env_fun
        .insert("key_1".to_string(), EnvFunction::Func(fun));
    cx.data += 1;
}

fn main() {
    let mut cx = Content::new();
    init_built_in_functions(&mut cx);

    let EnvFunction::Func(target_func) = cx.map_env_fun.get_mut("key_1").unwrap();
    // --------------------------------------------------------------
    target_func(&mut cx);      // Error:编译失败
    // --------------------------------------------------------------

    println!("Content data: {}", cx.data);
}

Ext Link: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=072c17bf78b0cdb99dfa33e408007a7b

评论区

写评论
‘static 2024-08-17 00:28
  • 如果不要求map里的函数复用的的话 可以修改成这样
   let EnvFunction::Func(mut target_func) = cx.map_env_fun.remove("key_1").unwrap();
    target_func(&mut cx);
1 2 共 21 条评论, 2 页