【已解决】(感谢e神)《仍有讨论的地方》(规则问题、无法编译、限制)可变struct中的闭包参数使用struct本身、挑战可变借用多次无法编译

💡 原文中文,约1200字,阅读约需3分钟。
📝

内容提要

这篇文章讨论了如何将Rust函数绑定到解释器中使用。作者想要让从cx中获取的target_func作为上下文传入,但是无法实现。文章提供了相关代码,并指出编译错误。

🔎

延伸解读

问题核心:可变借用冲突

代码中,`cx.map_env_fun.get_mut` 返回对 `cx` 内部字段的可变借用,该借用持续到 `target_func` 使用结束。随后调用 `target_func(&mut cx)` 又需要 `cx` 的可变借用,导致同一作用域内同时存在两个可变借用,违反 Rust 的借用规则,因此编译失败。

闭包参数与结构体自引用的矛盾

作者希望将 `cx` 作为上下文传入从 `cx` 中取出的函数,这形成了结构体自引用:函数存储在 `cx` 内部,却需要 `&mut cx` 作为参数。Rust 的所有权模型难以直接表达这种模式,因为无法在持有内部可变借用的同时,再将整个结构体可变借用给函数。

可能的解决方向

要解决此问题,可考虑将函数从 `map_env_fun` 中临时取出(如使用 `remove` 或 `std::mem::take`),调用后再放回,从而避免同时借用。或者使用 `Rc<RefCell<...>>` 等内部可变性容器,但需注意运行时借用检查。具体方案需根据解释器设计权衡。

❓

Q&A

如何将Rust函数绑定到解释器中使用?

可以通过定义一个结构体和枚举来实现,将Rust函数作为闭包存储在HashMap中。

在Rust中如何定义一个包含闭包的结构体?

可以定义一个结构体,例如Content,包含一个HashMap,HashMap的值为EnvFunction枚举,其中存储闭包。

为什么在调用target_func时会出现编译错误?

编译错误可能是由于target_func的类型不匹配或闭包的借用规则未遵循导致的。

init_built_in_functions函数的作用是什么?

该函数用于初始化内置函数,并将其插入到Content结构体的map_env_fun中。

如何在Rust中使用HashMap存储函数?

可以使用HashMap<String, EnvFunction>来存储函数,其中EnvFunction是一个枚举,包含闭包类型。

在Rust中如何处理闭包的借用问题?

需要确保闭包的借用符合Rust的所有权和借用规则,避免多次可变借用导致的编译错误。

➡️

继续阅读