Rust中如何创建字符串到函数的映射结构?
问题描述
我正在通过开发 Make a Lisp 项目学习 Rust。在实现求值器步骤时,我需要构建一个关联结构,实现字符串(或其他类型键)到函数的映射。
在我更熟悉的 Ruby、Clojure 等语言中,我可以直接在哈希表中定义匿名函数,示例如下:
{ :+ (fn [a b] (+ a b)) :- (fn [a b] (- a b)) } ; etc
但在 Rust 中该写法无法通过编译,会触发类型错误:expected closure, found a different closure,对应问题代码如下:
let repl_env = HashMap::new(); repl_env.insert("+", |a, b| a + b); repl_env.insert("-", |a, b| a - b); // expected closure, found a different closure
已做的排查与推测
我判断报错原因如下:
- 编译器会将
HashMap的泛型类型推断为<&str, 第一个插入闭包的具体类型> - 第二个闭包与第一个闭包类型不一致,正如编译器错误提示所述:
no two closures, even if identical, have the same type(任意两个闭包,即便实现完全一致,也属于不同类型)
我尝试为闭包参数添加类型标注,让编译器可以推断返回值类型,但问题仍然存在。我猜测需要显式标注闭包本身的类型,但没有在文档中找到对应的实现方法。编译器错误提示建议使用 Box 进行封装,但我用Box::new包裹闭包后依然报错(我此前从未使用过Box)。
待确认的问题
- 在 HashMap 中存储 Rust 闭包是否是该场景的最优实现?
- 是否应该使用某种
enum来实现映射?(后续开发中我需要支持动态向 Lisp 环境添加用户自定义函数,因此猜测 enum 方案可能不适用)
内容的提问来源于stack exchange,提问作者djb
相关产品推荐
相关产品推荐

